SHELL 脚本(1)

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的方式保留空格和换行符

  • 当我们使用子shell或反引用的方法将命令的输出读入一个变量中,可以将它放入双引号中,以保留空格和换行符(\n) ???
$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 
./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
#用true作为循环条件能够产生无限循环

#until循环
x=0;
until [ $x -eq 9 ]; # [ $x -eq 9 ] is the condition

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值