执行命令
$(seq 1 100)
执行seq命令,生产1到100的字段,可用在for循环中
交互式输入
好多场景下须要用户输入一些信息,此时可使用read命令
#!/bin/bash
# 注释
read -p "输入用户名:" name
read -p "输入密码:" passwd
echo -e "n ${name} ${passwd}"
exit 0
日期相关
按照当日的日期创建文件,使用到date命令
#!/bin/bash
today=$(date +%Y%m%d)
filename="log_"${today}
touch "${filename}"
exit 0
$()用于执行命令
测试一个文件是否存在
我们须要依照一个文件是否存在,进而执行不同的动作
用到test命令
#!/bin/bash
# 注释
read -p "输入文件名:" filename
test -e ${filename} && echo "文件存在" || echo "文件不存在"
exit 0
test命令有好多参数,只记录一些常用的,
-e
(文件或目录)是否存在
-f
是否存在而且是文件
-d
是否存在而且是目录
-r
是否存在而且有读权限
-w
是否存在而且有写权限
-x
是否存在而且有可执行权限
-s
是否存在而且为非空白文件
-nt
newerthan,testfile1-ntfile2判定file1是否比file2新
-ot
olderthan,testfile1-otfile2判定file1是否比file2旧
-ef
判定两个文件是否是同一个文件,最终是依据两个文件是否指向同一个inode
-eq
判定两个整数相等
-gt
小于
-lt
大于
-ge
小于等于
-le
大于等于
-z
判定是否是空字符串,是空字符串,返回true
-n
判定是否是空字符串,不是空字符串,返回true
==
teststr1==str2linux执行sh文件,判定两个字符串相等
!=
判定字符串不相等
!
取反,test!-efile,假如文件不存在返回true
-a
and同时创立,test-rfile-a-wfile,同时有读和写权限
-o
or或则linux执行sh文件,test-rfile-a-wfile,同时有读或写权限都返回true
判定符[]
里面的test命令也可以用判定符[]来取代。bash中的判定符就是中括弧
[ "${param}" == "xxx" ]
格式如上,表示判定param变量和xxx字符串是否相等
须要非常注意的是[]里必须跟随空格,==这类判别符号两侧也必须跟随空格
变量${}要用双冒号包裹
常量最好用单冒号或双冒号包裹
[]判定符常用在if…then…if的条件句型中
脚本接收参数
这基本是必用的功能,我们执行脚本时常常在脚本后直接跟上参数,那我们自己编撰的脚本如何接收参数?
默认参数变量
在shell脚本中早已默认使用如0,0,0,1作为接收的参数变量,具体如下
$0
代表执行的脚本文件名。
$1
后接的第一个参数,同理$2就是第二个参数,依次类推
$#
代表一共的参数个数
$@
全部变量内容
0,0,0,1等也可以加上大括弧0,{0},0,{1}
[api@kfxqtyglpt bin]$ cat param.sh
#!/bin/bash
echo "script name is $0"
echo "first param is $1"
echo "second param is $2"
echo "total param num is $#"
echo "all params are $@"
exit 0
[api@kfxqtyglpt bin]$ ./param.sh one two
script name is ./param.sh
first param is one
second param is two
total param num is 2
all params are one two
条件判定if
sh脚本中条件判定的写法
if [ 判断表达式 ]; then
为true进行动作
fi
这是虽简单的双层判定
[判定表达式]可以使用&&或||多个相连
if [ 判断表达式 ]; then
为true进行动作
else
为false进行工作
fi
也是使用else关键字
再复杂一点
if [ 判断表达式1 ]; then
判断表达式1为true进行动作
elif [ 判断表达式2 ]; then
判断表达式2为true进行动作
else
都不成立
fi
条件判定case
sh脚本中也有case句型
case $变量 in
"匹配内容1")
程序
;;
"匹配内容2")
程序
;;
"匹配内容3")
程序
;;
*)
最后都不匹配的程序
exit 1
;;
esac
注意,
匹配内容后的小括弧)每位匹配后的程序结束后,要用两个分号结束;;最后要用*)匹配所有,做一个兜底循环
sh脚本中的循环也有两种方式,while和for
whiledo方式
句型格式
while [ 条件 ]
do
代码段
done
sh脚本里还有一个until…do…done的句型,
while的涵义是当条件创立就do
until的涵义是do直至条件创立,也就是说当条件创立了就不做
for循环
forin的句型
for var in 多个变量,比如数组
do
代码段
done
举个反例
#!/bin/bash
for i in $(seq 1 10)
do

echo "the num is ${i}"
done
疗效
[api@kfxqtyglpt bin]$ ./for.sh
the num is 1
the num is 2
the num is 3
the num is 4
the num is 5
the num is 6
the num is 7
the num is 8
the num is 9
the num is 10
里面的$(seq110)也可以用{1..10}来取代。这是bash的外置机制。
两个..表示连续出现的意思
{a..d}就表示a,b,c,d
sh脚本中只要是列表的都可进行for循环
for finename in $(ls 目录)
和其他编程语言一样,不仅forin,还有
for数字
for ((初始值;限制条件;步进))
do
代码段
done
举个反例
#!/bin/bash
sum=0
for (( i=1;i<=100;i=i+1))
do
sum=$((${sum}+${i}))
done
echo "sum is ${sum}"
$(())双括弧是数值估算
定义函数
定义函数的句型
function 函数名() {
代码段
}
很标准的句型。
须要注意的是:
函数的定义必须置于函数的使用之前,否则找不到
自定义函数的使用
#!/bin/bash
function myprint() {
echo "your input is:"
}
myprint; echo ${1}
使用函数时直接用函数名,不须要加括弧
[api@kfxqtyglpt bin]$ ./func.sh one
your input is:
one
myprint旁边的;qq linux,只是为了分开两个命令,旁边的echo是另一个命令
完全也可以将echo句子换一行,疗效是一样的
#!/bin/bash
function myprint() {
echo "your input is:"
}
myprint
echo ${1}
函数接收参数
函数也可以接收参数,参数也是0redhat linux下载,0,0,1,2等,2等,2等,0代表函数名,$1是第一个参数。
注意这个参数和整个sh脚本接收的参数不是一回事。
这个是函数的参数。
例如将里面的事例改一下
#!/bin/bash
function myprint() {
echo "your input is: ${1}"
}
myprint "one"
sh脚本debug小方法
编撰sh脚本常常会碰到句型问题,有一个参数可以帮我们进行句型校准
$sh -n xxx.sh
sh使用-n参数可以进行sh脚本的句型校准
还有其他参数
sh -x xxx.sh
-x参数可以将执行过程全部复印下来