002、脚本基础2
本文最后更新于 257 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com

脚本基础2

1.1 条件表达式

1.1.1 文件判断

常用文件测试操作符

常用文件测试操作符 说明
-d文件,d的全拼为directory 文件存在且为目录则为真,即测试表达式成立
-f文件,f的全拼为file 文件存在且为普通文件则为真,即测试表达式成立
-e文件,e的全拼为exist 文件存在则为真,即测试表达式成立。注意区别于“-f”,-e不辨别是目录还是文件
-r文件,r的全拼为read 文件存在且可读则为真,即测试表达式成立
-s文件,s的全拼为size 文件存在且文件大小不为0则为真,即测试表达式成立
-w文件,w的全拼为write 文件存在且可写则为真,即测试表达式成立
-x文件,x的全拼为executable 文件存在且可执行则为真,即测试表达式成立
-L文件,L的全拼为ink 文件存在且为链接文件则为真,即测试表达式成立
fl -nt f2,nt的全拼为 newer than 文件fl比文件f2新则为真,即测试表达式成立。根据文件的修改时间来计算
fl -ot f2,ot的全拼为 older than 文件fl比文件f2旧则为真,即测试表达式成立。根据文件的修改时间来计算

判断文件是否存在

[root@clsn scripts]# [ -f /etc/hosts ]
[root@clsn scripts]# echo $?
0
[root@clsn scripts]# [ -f /etc/hosts1 ]
[root@clsn scripts]# echo $?
1 

判断文件是否存在,返回方式

[root@clsn scripts]# [ -f /etc/hosts ] && echo "文件存在" || echo "文件不存在" 

文件存在

[root@clsn scripts]# [ -f /etc/hosts1 ] && echo "文件存在" || echo "文件不存在" 

文件不存在
判断目录是否存在

[root@clsn scripts]# [ -d /tmp ] && echo "目录存在" || echo "目录不存在" 

目录存在

[root@clsn scripts]# [ -d /tmp1 ] && echo "目录存在" || echo "目录不存在" 

目录不存在
使用变量的方法进行判断

dir=/etc1/;[ -d $dir ] && tar zcf etc.tar.gz $dir || echo "$dir目录不存在" 
1.1.2 字符串判断

字符串测试操作符

常用字符串测试操作符 说明
-n "字符串" 若字符串的长度不为0,则为真,即测试表达式成立,n可以理解为no zero
-Z "字符串" 若字符串的长度为0,则为真,即测试表达式成立,z可以理解为zero的缩写
"串 1"== "串 2" 若字符串1等于字符串2,则为真,即测试表达式成立,可使用"=="代替"="
"串 1" != "串 2" 若字符串1不等于字符串2,则为真,即测试表达式成立,但不能用"!=="代替"!="

1.对于字符串的测试,一定要将字符串加双引号之后再进行比较。
2.空格非空

-z 判断字符串长度

[root@clsn scripts]# x=  ; [ -z "$x" ] && echo "输入为空" || echo '输入有内容'
输入为空
[root@clsn scripts]# x=12 ; [ -z "$x" ] && echo "输入为空" || echo '输入有内容'
输入有内容 

-n 判断字符串长度

[root@clsn scripts]# x=12 ; [ -n "$x" ] && echo "输入有内容" || echo '输入为空'
输入有内容
[root@clsn scripts]# x= ; [ -n "$x" ] && echo "输入有内容" || echo '输入为空'
输入为空 

"串 1" == " 串 2 " 使用定义变量的方式进行判断

cmd=$1
[ "$cmd" == "start" ] && echo start
# 测试
[root@clsn scripts]# cmd=start;[ "$cmd" == "start" ] && echo start
start 
1.1.3 整数判断

整数二元比较操作符参考

在[]以及test中 使用的比较符号 在(())和[[]]中 使用的比较符号 说明
-eq ==或= 相等,全拼为equal
-ne != 不相等,全拼为not equal
-gt > 大于,全拼为greater than
-ge >= 大于等于,全拼为greater equal
-lt < 小于,全拼为丨ess than
-le <= 小于等于,全拼为less equal

判断两数是否相等

[root@clsn scripts]# [ 1 -eq 1 ]
[root@clsn scripts]# echo $?
0
[root@clsn scripts]# [ 1 -eq 2 ]
[root@clsn scripts]# echo $?
1 

大于等于

[root@clsn ~]# [ 11 -ge 1 ] && echo "成立" || echo "不成立"
成立 

小于

[root@clsn ~]# [ 11 -lt 1 ] && echo "成立" || echo "不成立"
不成立 

大于

[root@clsn ~]# [ 11 -gt 1 ] && echo "成立" || echo "不成立"
成立 

不等于

[root@clsn ~]# [ 11 -ne 1 ] && echo "成立" || echo "不成立"
成立 
1.1.4 逻辑符号

常用逻辑操作符

在[]和test中使用的操作符 说明 在[[]]和中使用的操作符 说明
-a [ 条件A -a 条件B ] A与B都要成立,整个表达式才成立 && and,与,两端都为真,则结果为真
-o [ 条件A -o 条件B] A与B都不成立,整个表达式才不成立 || or,或,两端有一个为真,则结果为真
! not,非,两端相反,则结果为真

逻辑操作符与整数判断配合

[root@clsn ~]# [ 11 -ne 1 ] && echo "成立" || echo "不成立"
成立 

取反

[root@clsn ~]# [ ! 11 -ne 1 ] && echo "成立" || echo "不成立"
不成立 

两边都为真

[root@clsn ~]# [  11 -ne 1 -a 1 -eq 1 ] && echo "成立" || echo "不成立"
成立 

至少有一边为真

[root@clsn ~]# [  11 -ne 1 -o 1 -eq 1 ] && echo "成立" || echo "不成立"
成立 

感叹号的特殊用法

使用历史命令,感叹号加上history中的序号,即可执行
[root@clsn ~]#  !516
 ls
anaconda-ks.cfg  bootime.avg  setup.sh  vim 

1.2 if条件语句

条件表达式和if语句可以互相转换

1.2.1 三种语法

单分支语句
双分支语句

if [ -f /etc/hosts ]  
then
   echo "文件存在"
else
echo "文件不存在"
   echo "..." >>/tmp/test.log
fi 

多分支语句

if [ -f /etc/hosts ] 
then
   echo " hosts文件存在"
elif [ -f /etc/host ]
then
   echo " host文件存在"
fi 
1.2.2 if条语句小结

单分支:一个条件一个结果
双分支:一个条件两个结果
多分支:多个条件多个结果

1.3 case条件结构语句

1.3.1 case语法结构
1.3.2 case与if的对比
case书写方式
if书写方式
if [ $name == "值1" ]
  then 
    指令1
elif [ $name == "值2" ]
  then 
    指令2
else
    指令    
fi 
1.3.3 case值的书写方式
apple)

  echo -e "$RED_COLOR apple $RES"

  ;; 

也可以这样写,输入2种格式找同一个选项

apple|APPLE)

  echo -e "$RED_COLOR apple $RES"

  ;; 
1.3.4 case语句小结

   😋 case语句就相当于多分支的if语句。case语句的优势是更规范、易读。
   😋 case语句适合变量的值少,且为固定的数字或字符串集合。(1,2,3)或(start,stop,restart)。
  😋 系统服务启动脚本传参的判断多用case语句,多参考rpcbind/nfs/crond脚本;菜单脚本也可以使用case

1.4.4 if 与 case 对比

  if 语句类似黑名单,需要把这种错误场景封堵
  case 语句类似白名单,只要把正确结果列完整即可

1.5 其他补充说明

1.5.1 linux中产生随机数的方法
[root@clsn scripts]# echo $RANDOM 
29291
[root@clsn scripts]# echo $RANDOM 
5560
[root@clsn scripts]# echo $RANDOM 
2904 
1.5.2 echo 命令输出带颜色字符
#彩色字体
echo -e "\033[30m 黑色字 clsn \033[0m"
echo -e "\033[31m 红色字 clsn \033[0m"
echo -e "\033[32m 绿色字 clsn \033[0m"
echo -e "\033[33m 黄色字 clsn \033[0m"
echo -e "\033[34m 蓝色字 clsn \033[0m"
echo -e "\033[35m 紫色字 clsn \033[0m"
echo -e "\033[36m 天蓝字 clsn \033[0m"
echo -e "\033[37m 白色字 clsn \033[0m" 
# 彩色底纹
echo -e "\033[40;37m 黑底白字 clsn \033[0m"
echo -e "\033[41;37m 红底白字 clsn \033[0m"
echo -e "\033[42;37m 绿底白字 clsn \033[0m"
echo -e "\033[43;37m 黄底白字 clsn \033[0m"
echo -e "\033[44;37m 蓝底白字 clsn \033[0m"
echo -e "\033[45;37m 紫底白字 clsn \033[0m"
echo -e "\033[46;37m 天蓝白字 clsn \033[
# 特效字体
\033[0m 关闭所有属性
\033[1m 设置高亮度
\033[4m 下划线
\033[5m 闪烁
\033[7m 反显
\033[8m 消隐
\033[30m — \033[37m 设置前景色
\033[40m — \033[47m 设置背景色
\033[nA 光标上移 n 行
\033[nB 光标下移 n 行
\033[nC 光标右移 n 行
\033[nD 光标左移 n 行
\033[y;xH 设置光标位置
\033[2J 清屏
\033[K 清除从光标到行尾的内容
\033[s 保存光标位置
\033[u 恢复光标位置
\033[?25l 隐藏光标
\033[?25h 显示光标 
1.5.3 显示文本中的隐藏字符
使用cat命令查看文本中的隐藏字符
[root@clsn ~]# cat --help
用法:cat [选项]... [文件]...
将[文件]或标准输入组合输出到标准输出。

  -A, --show-all           等于-vET
  -b, --number-nonblank    对非空输出行编号
  -e                       等于-vE
  -E, --show-ends          在每行结束处显示"$"
  -n, --number             对输出的所有行编号
  -s, --squeeze-blank      不输出多行空行
  -t                       与-vT 等价
  -T, --show-tabs          将跳格字符显示为^I
  -u                       (被忽略)
  -v, --show-nonprinting   使用^ 和M- 引用,除了LFD和 TAB 之外 

使用cat -A查看隐藏的字符
[root@clsn ~]# cat -A /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4$
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6$
10.0.0.1 mirrors.aliyuncs.com mirrors.aliyun.com$
10.0.0.180 clsn$ 
关于隐藏字符常见错误
在windows中编写的脚本换行使用的是 \r\n
         但是在linux中使用\n 进行换行

[root@clsn ~]# cat -A windowe.sh 
n1=2^M$
n2=1^M$
^M$
[ $n1 -gt $n2 ] && echo "$n1 > $n2" && exit^M$
[ $n1 -eq $n2 ] && echo "$n1 = $n2" && exit^M$
echo "$n1 < $n2"^M$ 

使用dos2unix 把windows上的脚本转化linux格式
[root@clsn ~]# dos2unix windowe.sh 
dos2unix: converting file windowe.sh to Unix format ... 
转换后,脚本的内容隐藏内容改变。

[root@clsn ~]# cat -A windowe.sh 
n1=2$
n2=1$
$
[ $n1 -gt $n2 ] && echo "$n1 > $n2" && exit$
[ $n1 -eq $n2 ] && echo "$n1 = $n2" && exit$
echo "$n1 < $n2"$ 
1.5.4 排错技巧
sh -x  脚本.sh
-x 开启脚本调试模式 
cat -A  文件.txt
-A  查看文件的隐藏字符 
1.5.6 其他补充
类进度条效果
yum install -y pv 
echo {1..20}|pv -qL 15 
  clear 命令
清屏 == ctrl + l 
谨此笔记,记录过往。凭君阅览,如能收益,莫大奢望。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇