哎。。。又是好长好长好长时间没更新米V米,原因的话,你们应该都知道的,就是在做 K3 的 LEDE 嘛,然后我也做了两个月了,各方面也都差不多了,所以我决定把固件的事先放一放,把精力都放到网站还有其他事情上面,是不是废话又太多了。。。
咳咳,进入我们今天的正体,做固件这种事,少不了和 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 没多久,如果有错误,欢迎指正,不懂的同学可以在下面评论。
微信扫描二维码关注我们
如果觉得文章有帮助到你,可以点击下方的打赏按钮赞助下服务器费用。
文章评论