SHELL 脚本 编程(1)
检测命令是否执行成功
#!/bin/bash
#filename:successTest.sh
CMD="command" #command is the test order
$CMD
if [ $? -eq o ];
then
echo "CMD executed successfully"
else
echo "$CMD terminated unsuccessfully"
fi
echo $? $?会给出上一次执行命令的返回值 如果命令成功退出那么退出的状态为0,否则为非0.
读取序列输出
$cmd1 | cmd2 | cmd3
$ls | cat -n > 1.txt
1.txt
2 20210909.sh
3 20210910.sh
4 a1
5 a2
6 a3
7 lib1
8 lib2
9 lib3
10 nohup.out
11 test2.sh
12 test.sh
13 userdata
cmd_output=$(ls | cat -n) cmd_output=ls | cat -n echo $cmd_output
利用shell成立一个独立的进程
可以使用()操作符来定义一个子shell pwd (cd /bin; ls) pwd ::当前目录不会改变
通过引用子shell的方式保留空格和换行符
$cat 1.txt
1
2
3
out=$(cat 1.txt) echo
o
u
t
o
u
t
1
=
"
out out1="
outout1="(cat 1.txt)" echo $out
## READ命令
从输入中读取n个字符并存入变量variable
read -n numChars variable
examole:
read -n 2 var
echo $var
用不回显(non-echo)的方式读取要保护的信息(密码)
read -s var 输入数据到var(终端不可视)
显示提示信息
read -p “Enter input:” var
在特定的时限内读输入
read -t timeout var example read -t 2 var (2s)
用界定符结束输入行
read -d “:” var hello: var被设置为hello
字段分隔符和迭代器
内部字段分隔符(internal field separator IFS) IFS是存储定界符的环境变量。她是当前shell环境变量的默认定界字符串
data="name,sex,rollnoo,location"
oldIFS=$IFS
IFS=","
for item in $data
do
echo Ttem: $item
done
IFS=$oldIFS
输出 Ttem: name Ttem: sex Ttem: rollnoo Ttem: location
IFS默认值为空白字符(换行符,制表符或者空格)
root@lilongiu-VirtualBox:~/study/shell
./20210910.sh: 第 118 行: [: 缺少 `]'
./20210910.sh: 第 119 行: [: 缺少 `]'
书写[] 的前后都需要有空格 不然会报上面的错误
line="root:x:0:0:root:/root:/bin/bash"
oldIFS=$IFS
IFS=":"
count=0
for item in $line;
do
[ $count -eq 0 ] && user=$item;
[ $count -eq 6 ] && shell=$item;
let count++
done;
IFS=$oldIFS
echo $user\'s shell is $shell;
输出为root’s shell is /bin/shell
循环
for var In list;
do
commands
done
list can be a string or a sequence
fo( (i=0;i<10;i++) )
{
commands
}
while
while conditong
do
commands;
done
x=0;
until [ $x -eq 9 ];
do
let x++;
done
比较测试
if
if condition;
then
commands;
fi
else if && else
if condition;
then
commands;
elif condition;
then
commands
else
commands
fi
逻辑运算符比较
[ conditiong ] && action ; #如果condition为真,则执行action [ condition ] || action; #如果condition为假,则执行action
算术比较 [ $var -eq 0 ]
对变量值进行算术条件判断 [ KaTeX parse error: Expected 'EOF', got '#' at position 14: var -eq 0 ] #?当var等于0时,返回真 [ &var -ne 0 ] #当$var不等于0时,返回真
其他重要操作符
gt; 大于 -lt :小于 -ge :大于或小于 -le:小于或等于
可以结合使用 [ $var -ne 0 -a $ var2 -gt 2 ] #使用逻辑与 -a [ $var -ne 0 -o var2 -gt 2 ] # 逻辑或 -o
文件系统的相关测试
[ -d $var ] :如果给定的变量包含的是目录,则返回真 [ -e $var ]:如果给定的变量包含的文件存在,则返回真 [ -c $var ]:如果给定的变量包含的是一个字符设备文件的路径,则返回真 [ -b $var ]:如果给定的变量包含的是一个块设备文件的路径,则返回真 [ -w $var ]:如果给定的变量包含的文件可写,则返回真 [ -r #var ]:如果给定的变量包含的文件可读,则返回真 [ -L $var ]:如果给定的变量包含的是一个符号链接,则返回真
example:
fpath="/etc/passwd"
if [ -e $fpath ];
then
echo File exists;
else
echo File not exist;
fi
字符串比较
使用字符串比较,最好使用双中括号 [ [ $str1 != $str2 ] ]
[ [ $str1 = $str2 ] ] [ [
s
t
r
1
=
=
str1 ==
str1==str2 ] ]
[ [ $str1 > $str2 ] ] [ [ $str1 < $str2 ] ]
[ [ -z $str2 ] ] 如果str1包含的是空字符串,则返回真 [ [ -n $str2 ] ] 如果str1包含的是非空字符串,则返回真
example:
if [ [ -n $str1 ] ] && [ [ -z $str2 ] ]
then
commands;
fi
str1="hello"
str2=""
if [ [ -n $str1 ] ] && [ [ -z $str2 ] ]
then
echo str1 is non-empty and str2 is empty string
fi
输出str1 is non-empty and str2 is empty string if [ $var -eq 0 ]; then echo ''True"; fi #can be write as if test $var -eq 0; then echo “True”; fi
|