Linux Shell 特殊符号及变量用法

哎。。。又是好长好长好长时间没更新米V米,原因的话,你们应该都知道的,就是在做 K3 的 LEDE 嘛,然后我也做了两个月了,各方面也都差不多了,所以我决定把固件的事先放一放,把精力都放到网站还有其他事情上面,是不是废话又太多了。。。

咳咳,进入我们今天的正体,做固件这种事,少不了和 Linux 打交道,而且我固件的一些附加功能是用 Shell 脚本实现的,需要熟悉 Linux Shell 命令和一些特殊符号和变量的运用,今天我就跟大家分享一下我的见解。

Linux Shell 特殊符号和变量用法

特殊符号

~ 用过 Linux 的人肯定都不陌生,它代表当前用户的 Home 目录。比如,当前的用户名为:hill,那么它就是 /home/hill,如果是 root ,就是 /root,有时候想定位到 Home 目录,可以直接输入 cd ~

~+ 代表当前工作目录,和 pwd 命令作用相同,pwd 可以直接输出当前工作目录,使用 echo ~+ 也可以输出当前工作目录,如果你需要在一些命令里获取当前工作目录,那 ~+ 无疑会更方便一些。

~- 代表上次的工作目录,举个栗子:你当前的工作目录是 /root,cd /tmp 定位到了 /tmp,输入 echo ~- 就可以输出上次的工作目录,也就是 /root。

. 一个点代表当前工作目录,两个点代表当前工作目录的上级工作目录,不过不同的是,这个点不是一个变量,而是类似一个特殊目录的形式,所以 echo 是无法输出的。

小白知识:Home 目录相当于 Windows 下 C:\Users\ 里的目录,只允许被当前用户使用,工作目录就是你当前所在目录。

; 分号在命令里经常会用到,比如:循环,判断,它的作用就是连续指令,上个命令执行完毕后,继续执行下一个指令。举个栗子:cd ~;mkdir test;cd test,依次定位到 Home 目录,创建一个名为 test 的目录,定位到 test。我们需要执行多个命令的时候,可以使用分号衔接。 两个分号用到的地方不多,好像只有 case 语句里会用到,用来分割条件和操作。Linux Shell case 语句示例:a=123;case "$a" in 123) echo 123;;1234) echo 1234;;esac # 123

' " 单引号和双引号,这两个其实用处很相似,都是为了将其视为统一字符串,不同的是,单引号不会解析变量,双引号则可以解析变量,举个栗子:a=123;echo "$a" # 123 echo '$a' # $a

` 倒引号,我们先来说说这个符号怎么打出来,英文模式下按 Tab 键上面那个,对对对,就是那个,然后我们来说说这个怎么用。我们要把一个命令执行的结果赋值给变量,或者在命令里面调用别的命令的结果该怎么做,把命令使用倒括号包起来,举个栗子:a=`echo aaaa`;echo $a # aaaa,还有一种方法和倒括号有同样的作用,a=$(echo aaaa),我个人比较喜欢这个语法。

& 这个符号叫什么。。。我真不知道,一个符号的情况下可以同时执行多条命令,举个栗子:for i in `seq 10`;do echo $i;done & for i in `seq 10 20`;do echo $i;done # 两个循环是一起执行的。两个符号的情况下如果前面的命令执行成功,则继续执行后面的命令,举个栗子:mkdir test &&
echo test目录创建成功 # test 目录创建成功

| 这个符号。。。我也不知道叫什么,不要来在意这些细节,一个符号的情况下将一个命令的输出,传递给下一个命令的输入,举个栗子:echo a b c | awk '{print $1}' # a,还有栗子,比如你要处理一个下载的文件,不需要保存为文件,只需要利用这个符号就可以了:wget http://x.x.x/x.gz -O- | tar zxf -
# 这样就可以直接解压你下载的文件
。两个符号的情况下如果前面的命令执行不成功,则继续执行后面的命令,跟上面的 && 很相似,举个栗子:mkdir test ||
echo test目录创建失败 # test 目录创建失败

[ ] 方括号,其实也不能叫做符号,因为它其实是一个命令,作用是用来做判断,就是 if,举个栗子:a=a;b=b;[ "$a" = "$b" ] && echo a = b,它可以配合 && 或者 || 来使用,当然,也可以使用完整的 if 语句,举个栗子:if [ "$a" = "$b" ];then echo 0;else echo 1;fi

变量

首先我们来说一下变量赋值和一些小技巧,上面的特殊符号栗子中我们多次用到了变量,Linux Shell 里变量命名开头不能为数字,可以包含字母、数字和下划线。变量的定义很简单:a_1=1,引用变量只需要在 $ 后加上变量名称,或者 ${变量名称}:$a_1;${a_1},如果需要输出变量,请使用 echo,直接输出变量的值会被当作命令执行。

变量定义的一些小技巧:

echo ${a=1} # 如果 a 不存在则赋值为 1
echo ${a:=1} # 如果 a 不存在或者为空则赋值为 1
echo ${a:-1} # 如果 a 不存在或者为空则返回 1,但不会被赋值
echo ${a:+1} # 如果 a 存在且不空则返回 1,但不会被赋值
read a # 等待输入并把输入结果赋值给 a
a=`cat test` # 将 cat 命令的结果赋值给 a 不包含错误信息
a=`cat test 2>&1` # 将 cat 命令的结果赋值给 a 包含错误信息

一些特殊变量:

$$ 当前进程的 PID

$! 最后一个后台命令的 PID

$PPID 父进程的 PID

$? 最后一条命令的退出代码,可以用来判断命令是否执行成功,执行成功的命令一般都会返回 0

$* $@ 所有参数列表,比如写个 Shell 脚本可以用来获取所有参数值。

$# 参数数量

$0 Shell 自身的文件名,包含路径。

$x x 代表从1开始,比如 $1 就是获取传入的第一个参数,依次类推。

$HOME 当前用户的 Home 目录,跟上面的 ~ 差不多。

$PWD 当前工作目录,跟上面的 ~+ 差不多。

$LANG 当前的 locale 默认名称

$PATH 环境变量

变量的一些操作:

a=${a}b a 赋值为 $a + b,假如 $a 为 a,那么赋值后 a 便是 ab。

a=${a}${b} a 赋值为 $a + $b,假如 $a 为 a $b 为 b,那么赋值后 a 便是 ab。

a=$((1 + 2)) a 赋值为 1 + 2,$(()) 为 Shell 的运算表达式。

还有一些关于字符串的操作,我就不一一例举了,可以去看看这篇文章:http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html

我刚接触 Linux 没多久,如果有错误,欢迎指正,不懂的同学可以在下面评论。

微信公众号二维码

微信扫描二维码关注我们

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注