shell脚本
1.shell脚本执行方式
1.1 添加执行权
chmod u+x demo.h # 给demo.shell增加可执行权
./demo.shell # 直接运行
1.2 指定shell命令
bash demo.shell # 使用bash解释执行
2.shell变量
2.1 位置变量
预定义变量 |
含义 |
$0 |
shell脚本名 |
$1 ... |
传递给脚本的参数,$1代表第一个参数 |
2.2 预定义变量
预定义变量 |
含义 |
$# |
传递到脚本中参数数量 |
$* |
传递到脚本的所有参数内容 |
$? |
命令执行后返回的状态,0表示成功,其他值则表明其他执行错误 |
$$ |
当前进程的进程号 |
$! |
后台运行的最后一个进程号 |
2.3 命令替换
#将command运行结果赋值给var
#语法一
var = $(command)
#语法二
var = `command`
#例题一
echo "today is"`date`
today isSat Nov 14 12:36:07 CST 2020
#例题二
echo "User is `whoami`"
User is root
3.输入输出
3.1 read命令
read [选项] 命令列表
预定义变量 |
含义 |
-p 提示信息 |
设置提示信息 |
-n 数字 |
当read读多少个字符后返回 |
-s |
键盘输入屏幕不显示,用于密码输入 |
-t 超时时间 |
设置超时时间 |
-r |
取消转译字符的转义作用 |
-d delim |
定义新的换行符 |
3.2 echo命令
echo [选项] 字符串
4.shell中的引号
1.反引号
#命令替换
var1=`ls -l`
echo `pwd`
2.单引号
#实例一:
echo *
tdyq xtdyq
#实例二:
echo '*'
*
#实例三:
text='* mean all files'
echo $text
tdyq xtdyq mean all files
echo '$text'
$text
#单引号中有只有特殊含义的字符的时候不会进行转义,特殊字符加字符串的形式会进行转义
3.双引号
#在双引号中除了$ 反引号`和反斜杠\ 其余都保留原来的含义
#实例一: $text 内容被替换
text='whoami'
echo "* $text end"
* whoami end
echo "`$text`" #先替换再转译
root
echo "\$text" #\ 转译字符
$text
#实例二:加双引号和不加双引号的区别
echo "*"
*
echo *
tdyq xtdyq
5.条件表达式
#语法一:
test 条件表达式
#语法二:
[条件表达式]
5.1文件状态操作符
-d # 目录
-f # 文件
-r # 可读
-s # 文件长度大于0 返回真
-u # SUID被设置,返回真
-w # 可写,返回真
-x # 可执行,返回真
5.2字符串操作符
string # string非空,返回真
-n string # string的长度大于0,返回真
-z string # string长度为0,返回真
string1 = string2 # 相等返回真
string1!=string2 # 不等放回真
5.3数字操作符
5.4逻辑操作符
-a #且
-o #或
! #非
5.6命令操作符
cmd & #命令后台运行
6.判断语句
6.1条件语句
#语法一:
if [ 条件表达式 ]
then
命令
else
命令
fi
#语法二:
if [ 条件表达式 ];then
命令
fi
#语法三:
if test 条件表达式1
then
命令
elif[ 条件表达式2 ]
then
命令
else
命令
fi
练习1:判断当前目录下是否存在某文件
#!/bin/bash
echo "Enter a file name"
read file
if test -f $file
then
echo "File $file exists"
fi
练习2:在文本中查找字符串
#!/bin/bash
if grep "GNU" myfile>/dev/null
then
echo "\"GNU\"occurs in myfile"
else
echo
echo "\"GNU\"does not occur in myfile"
fi
6.2分支语句
case 变量 in
值1)
命令
;;
值2)
命令
;;
esac
练习1:使用分支语句判断上下午
#!/bin/bash
hour='date+%H'
case $hour in
0[1-9]1[01])
echo "早上"
;;
1[2-7])
echo "下午"
;;
*)
echo "晚上"
;;
esac
6.3循环语句
6.3.1 for循环
for 变量名 in 参数列表
do
命令
done
6.3.2算术表达式
expr 1 + 2
6.3.3 while循环
while [ 条件表达式 ]
do
命令
done
6.3.4 until 语句
until [ 条件表达式 ]
do
命令
done
6.3.5 函数
函数名(){
命令
return
}
补充:向shell脚本中传递参数
vim test4.sh
#!/bin/bash
file=$1
if test -f $file
then
echo "File $file exists"
fi
./test4.sh test1.sh
File test1.sh exists