目录
脚本功能强大,用起来也方便得很。本文进行记录,方便以后自己查看
一、变量的引用
如下的脚本:
usbcont=$(lsusb | grep "1234:")
echo "usb content is $usbcont"
if [ "$usbcont" != "" ]
then
echo ok
else
echo "error"
fi
如果usb的列表中有“1234:”字符串时,usbcont的值为“Bus 004 Device 003: ID 1234:0a04”(以我的测试为例),否则它的值为空。以上可以正常打印,如果列出的usb列表中有“1234:”的字符串内容,则后面的if判断条件成立,就打印出 "ok",否则变量 usbcont 的内容是空的,打印出 "error"。开始一行也可以打印出 "usb content is Bus 004 Device 003: ID 1234:0a04"
如果改成如下的样子:
usbcont=$(lsusb | grep "1234:")
echo 'usbct is $usbcont'
if [ '$usbcont' != '' ]
then
echo ok
else
echo "error"
fi
即第2、3行的双引号改成单引号,则不能正常工作,就不能打印变量的值了,会把$usbcont当作字符串直接打印出来:usbct is $usbcont,后面的if比较就永远成立了,不管是否有“1234:”的usb列表内容都会打印出“ok”
这个情况在终端也是一样的:
第一次采用单引号,结果直接把 $usbcont 当作字符串打印了出来,第二次采用双引号打印出了变量 usbcont 的值
二、判断指定的文件是否存在
if [ ! -f /data/aa.txt ]
then
touch /data/aa.txt
fi
以上示例代码,如果文件 /data/aa.txt 不存在,则创建它。
if [ -f /data/aa.txt ]
then
rm -f /data/aa.txt
fi
以上示例代码,如果文件 /data/aa.txt 存在,则删除它
三、判断目录是否存在
if [ ! -d /data/bb ]
then
mkdir /data/bb
fi
如果目录 /data/bb 不存在,则创建它。
if [ -d /data/bb ]
then
cd /data/bb
mkdir conf
touch aa.txt
fi
以上示例代码,如果目录 /data/bb 存在,则进入到 /data/bb,然后创建目录conf和文件 aa.txt
四、判断最近一次命令执行是否成功
mount /dev/mmcblk1p1 /mnt/sd
if [ $? -ne 0 ]
then
echo Error
else
echo Ok
fi
$? 表示最近一次的命令执行结果,通常执行成功为0,其它为失败,上面示例代码中,如果mount成功,则打印出 Ok,否则打印出 Error 字符串。
如果要卸载tf卡,则:
umount /mnt/sd
这样,再 ls /mnt/sd 时,结果就是空的了。
挂载tf卡时,如果不知道其原本的节点,可以通过命令来查询:
fdisk -l
我的结果如下所示:
最下面的 /dev/mmcblk1p1 就是tf卡的分区节点名称了:
mount /dev/mmcblk1p1 /mnt/sd
注意,这个是要挂载一个分区而不是上面的整个tf卡节点 /dev/mmcblk1,下面的示例:
mount /dev/mmcblk1 /mnt/sd
提示如下错误:
mount: /mnt/sd: wrong fs type, bad option, bad superblock on /dev/mmcblk1, missing codepage or helper program, or other error.
五、一些比较符号
-ne :不等于,上述第四节的示例代码表示最后一次的执行结果如果不等0,就走第一个分支,打印 Error
-eq :等于
-gt :大于
-ge:大于等于
-lt :小于
-le :小于等于
以上用于数字的比较,字符串则用普通c语言的方式:
if [ $a == $b ] #如果a等于b,则条件成立
if [ $a1 != $b2 ] #如果a不等于b,则条件成立
if [ -n $a ] #如果a 非空,则条件成立
if [ -z $a ] #如果a 为空,则条件成立
if [ $a ] #如果a 非空,则条件成立
需要注意的是,[] 的内外都要加空格,比如 if [ $a == $b ] 是正确的,而 if [$a == $b] 是不正确的
如果有多个条件,可以进行连接:
if [ $a ] && [ $a == $b ] #如果a不为空,而且a和b一样,则条件成立
if [ -z $a ] || [ $a != $b ] #如果a为空,或者a和b不一样,则条件成立
可以通过 ! 符号来反方向判断:
if [ ! $a == $b ] #如果a和b不相等,则条件成立
if [ -d /data/bb ] #如果目录 /data/bb 存在,则条件成立
if [ ! -d /data/bb ] #如果目录 /data/bb 不存在,则条件成立
六、"文件"的读取和写入
这里的“文件”是个代指,它可以是一个实际的文件,也可以是一个管脚,或者是一个“设备”。
读取一个gpio管脚的值,并赋给一个变量:
gpio_val=$(cat /sys/class/gpio/gpio123/value)
这里用cat显示它的值,然后用符号$来使它可以被引用,这个赋值方式和第一节中的完全一样,只是命令不一样罢了。如果要向它写入一个值就比较简单了:
echo 1 > /sys/class/gpio/gpio123/value
通过echo命令,可以方便地向任何“文件”写入内容,上述示例中向gpio123管脚写入了“1”。对于不同的“文件”,其允许接受的写入内容是不一样的,如果是普通文件,则可以写入任何内容,如果是特殊的“文件”,就比如上述的gpio管脚,可以写入“0”、“1”,但如果要写入“abcd”,那必定是失败的
如果要显示一个文件的内容,则:
cat /data/config.txt # 输出文件 /data/config.txt 的内容
cat /sys/class/gpio/gpio123/value # 显示gpio123管脚当前的值
echo /sys/class/gpio/gpio123/value # 打印:/sys/class/gpio/gpio123/value
echo cat /sys/class/gpio/gpio123/value # 打印:cat /sys/class/gpio/gpio123/value
echo $(cat /sys/class/gpio/gpio123/value) # 打印:1
由于脚本中是直接执行命令的:
cd /data
mkdir aa
/mnt/sd/test.sh
/sys/class/gpio/gpio123/value # bash: /sys/class/gpio/gpio123/value: command not found
所以,如果要把一个gpio管脚的值赋给一个变量,就不能是这样的:
gpio_val=/sys/class/gpio/gpio123/value
这样赋值之后,gpio_val的值是“/sys/class/gpio/gpio123/value”
七、echo打印输出
echo的打印输出很方便,可以有不同的形式:
a=1234
b="1234"
c='1234'
echo abc is a string #打印:abc is a string
echo "abc is a string" #打印:abc is a string
echo 'abc is a string' #打印:abc is a string
echo "a=$a, b=$b, c=$c" # 打印:a=1234, b=1234, c=1234
echo 'a=$a, b=$b, c=$c' # 打印:a=$a, b=$b, c=$c
echo "a="$a, "b="$b, "c="$c # 打印:a=1234, b=1234, c=1234echo a="$a", b="$b", c="$c" # 打印:a=1234, b=1234, c=1234
echo a=$a, b=$b, c=$c # 打印:a=1234, b=1234, c=1234
echo a=$(a) # bash输出:bash: a: command not found,然后打印:a=
echo $a # 打印:1234
根据实验表明,变量不能放在括号内:$(a),这样就不行,()内必需是相关的命令才行,所以对于第一节的示例来说:
usbcont=$(lsusb | grep "1234:")
echo "usb content is $usbcont"
是可以正常打印的,如果把第一行分开:
usb_all=$(lsusb)
usbcont=$($usb_all | grep "1234:")
echo "usb content is $usbcont"
则提示:bash: Bus: command not found
八、ubuntu切换到root用户
一般情况下,都是用普通用户登录进行操作的,如果有些操作需要root用户权限,可以通过命令前加 sudo 来临时提升权限
user@ubuntu# sudo mount /dev/mmcblk1p1 /mnt/sd
此时通常是需要输入当前用户的密码。
在有些情况下,希望直接以root用户来操作,可以通过如果方式切换到root:
user@ubuntu# sudo -S su
然后输入当前用户密码切换成功:
root@ubuntu#
N、其它可以参考的网址
shell 脚本中的 '-f' 和 '-d' 是什么意思_linux shell_脚本之家
LINUX Shell命令中$0、$1-9、$#、$?、$*、$@、$!、$、$-、$IFS含义及举例 - 寻梦99 - 博客园
linux——shell脚本中关于$和特殊变量的使用细节 - moutory - 博客园
shell变量及赋值_shell变量赋值-CSDN博客