shell脚本基本语法点

1. shell中一些比较特殊的变量:
特殊变量 含义
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是
$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲
到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 这些变量我们留 在这里备份,有用到就可以查。
2. Bash 支持很多运算符, 包括算数运算符、关系运算符、布尔运算符、字符串运算符和文件测试运算符。原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
value=expr 2 + 2
a=expr $a \* 1024

3. 关系运算符列表
运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 true。
-ne 检测两个数是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大 等于 右边的,如果是,则返回 true。 [ $a -ge $b ] 返回
false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true [ $a -le $b ] 返回
true。

4. 获取字符串的长度
echo ${#animal}

5. 对文件属性做测试的操作符
操作符 说明
-b file 检测文件是否是块设备文件,如果是,则返回 true。
-c file 检测文件是否是字符设备文件,如果是,则返回 true
-d file 检测文件是否是目录,如果是,则返回 true。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回
true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。
-p file 检测文件是否是具名管道,如果是,则返回 true。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。
-r file 检测文件是否可读,如果是,则返回 true。
-w file 检测文件是否可写,如果是,则返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。
用法:
if [ -r $file ]
then
echo “1”
fi

6. 各种语句
(1) if [ ]then … elif [ ] then… fi
(2)for((…)) do … done
(3) while((…))do…done
(4) until((…退出循环的条件…))do…done
(5)遍寻数组元素内容,使用 for…in… 语句如:
for var in ${arraynum[@]}
do
echo ${var}
done
(6) case语句:
case “变量名” in
字符串一)
执行语句一;;
字符串二)
执行语句二;;
esac

7. echo命令的-n、-e两个参数:
echo -n : 不换行输出
echo -e : 处理特殊字符
若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
\a 发出警告声;
\b 删除前一个字符;
\c 最后不加上换行符号;
\f 换行但光标仍旧停留在原来的位置;
\n 换行且光标移至行首;
\r 光标移至行首,但不换行;
\t 插入tab;
\v 与\f相同;
\ 插入\字符;
\nnn 插入nnn(八进制)所代表的ASCII字符;
例:$echo -n “123”
$echo “456”
输出为:123456
$echo -e “a\bdddd”
输出为:dddd

8. gcc -e,-v 参数的不同含义:
-e:使用grep -e 选项,只能传递一个参数。在单条命令中使用多个 -e 选项,得到多个pattern,以此实现OR操作。
-v :使用 grep -v 可以实现 NOT 操作。 -v 选项用来实现反选匹配的( invert match)。如,可匹配得到除下指定pattern外的所有lines
9. ping的参数:
-c 数目 : 在发送指定数目的包后停止
-i 秒数 :设定间隔几秒送一个网络封包给一台机器,预设值是一秒送一次
-t 存活数值:设置存活数值TTL的大小。
-s 字节数:指定发送的数据字节数,预设值是56,加上8字节的ICMP头,一共是64ICMP数据字节
例:ping -c 10 -i 0.5 192.168.120.206
ping -i 3 -s 1024 -t 255 192.168.120.206

10. wc命令
-c 或–bytes或–chars 只显示Bytes数。
-l 或–lines 只显示列数。
-w 或–words 只显示字数。

11. grep -v 关键字 ---- 用来忽略某关键字的输出

12. 管道的特殊性
a=“hehe”
cat file | while read line
do
a=“wuwu”
echo “ a " d o n e e c h o " a" done echo " a"doneecho"a”

输出:
wuwu
hehe //第二次打印的还是第一次设置的值
原因:shell的变量本来就是全局的,你这个例子里因为后面a=“wuwu"是在cat file后面的while read子shell里,所以后面输出时还是原来的"hehe”。(并发脚本)

解决方法:
a=“hehe”
while read line
do
a=“wuwu”
echo " a " d o n e < f i l e e c h o " a" done < file echo " a"done<fileecho"a
这种方式while循环是在本shell完成的,所以其中的赋值会影响本shell的a变量。

13. for逐行读和while逐行读是有区别的,如:
$ cat file
aaaa
bbbb fff ggg
cccc dddd
$ cat file | while read line; do echo $line; done
aaaa
bbbb fff ggg
cccc dddd
$ for line in $(<file); do echo $line; done
aaaa
bbbb
fff
ggg
cccc
dddd
for的逐行读遇到空格算一行,while的逐行读可以读到真正一行的末尾

14.可以使用cat语句将文本文件插入到另一个文件中(从尾部插入)
cat >> a.txt 将输入流插入到 a.txt 文件中
cat b.txt >> a.txt 将b.txt输入到a.txt中

15. sync 命令
buffer:为了解决写磁盘的效率
cache:为了解决读磁盘的效率
linux系统为了提高读写磁盘的效率,会先将数据放在一块buffer中。在写磁盘时并不是立即将数据写到磁盘中,而是先写入这块buffer中了。此时如果重启系统,就可能造成数据丢失。
sync命令用来flush文件系统buffer,这样数据才会真正的写到磁盘中,并且buffer才能够释放出来,flush就是用来清空buffer。sync命令会强制将数据写入磁盘中,并释放该数据对应的buffer,所以常常会在写磁盘后输入sync命令来将数据真正的写入磁盘。
如果不去手动的输入sync命令来真正的去写磁盘,linux系统也会周期性的去sync数据。

16. 挂载/卸载
挂载: mount -t nfs serverIP:server_file_pathname /mnt/nfs/
卸载: umount -l /mnt/nfs/

17. tftp 命令
tftp -g -r filename serverIP //下载
tftp -p -r filename serverIP //上传

18. sed命名:https://blog.csdn.net/lml282518588/article/details/52918765
sed -n ‘2p’ filename 打印特定行
sed -i ‘2d’ filename 删除特定行
sed -i “s? d e s ? s r c ? g " f i l e n a m e 用 s r c 全 局 替 换 d e s s e d − i " des?src?g" filename 用src全局替换des sed -i " des?src?g"filenamesrcdessedi"{line_l}c ${name_new}” /tmp/namelist.txt

在每行的头添加字符,比如"HEAD",命令如下:
sed ‘s/^/HEAD&/g’ test.file
在每行的行尾添加字符,比如“TAIL”,命令如下:
sed 's/KaTeX parse error: Expected 'EOF', got '&' at position 2: /&̲TAIL/g' test.fi…"代表行尾
2.'s/$/&TAIL/g’中的字符g代表每行出现的字符全部替换,如果想在特定字符处添加,g就有用了,否则只会替换每行第一个,而不继续往后找了

常用选项:
-n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
-e∶直接在指令列模式上进行 sed 的动作编辑;
-f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
-r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
-i∶直接修改读取的档案内容,而不是由萤幕输出。
常用命令:
a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

19. xargs 命令
ps | grep /shell/ftpupload.sh | grep -v grep | awk ‘{print $1}’ | xargs kill -9
通过管道将过滤出来的同名进程号都传递给 xargs kill ,进行逐个杀死
ls |grep -v keep |xargs rm #删除keep之外的所有文件
解释:-v参数决定了匹配之外的结果。即keep之外的所有文件名
xargs用来从标准输入获得参数,并且传递给后面的命令,此处命令为rm
awk ‘END {print}’ <==> tail -n 1 取出输出最后一行

20.获取屏幕输入
read [-options] [variable]
例:read file_name

21.alias
1.打开需编辑的文件
vim ~/.bashrc
2.文件中如下写(举个栗子)
alias gitll=’git pull’
alias gitsh=’git push’
3.最后执行文件使其及时生效
source ~/.bashrc

22.计算md5值
find sv-4g-firmware/ -path sv-4g-firmware/md5 -prune -o -type f -print0 | xargs -0 md5sum > sv-4g-firmware/md5/.sv-4g-firmware.md5

23.不排序去重,去除文件中的相同行
awk ‘!a[$0]++’ /tmp/data_udisk_total.txt

24.Linux 统计某个字符串出现的次数
要统计一个字符串出现的次数,这里现提供自己常用两种方法:

  1. 使用vim统计
    用vim打开目标文件,在命令模式下,输入
    1 :%s/objStr//gn
    即可
  2. 使用grep:
    1 grep -o objStr filename|wc -l
    如果是多个字符串出现次数,可使用:
    1 grep -o ‘objStr1|objStr2’ filename|wc -l #直接用| 链接起来即可

25. shell脚本中的整数运算、小数运算
offset_time= ( a w k − v x = (awk -v x= (awkvx=data_time -v y=$data_time_temp ‘BEGIN{printf “%.3f”,x - y}’)
offset_time=expr $data_time - 1 - $data_time_temp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值