执行命令

sh脚本中也是使用$()来执行linux命令

$(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

执行文件查询_执行文件后缀_linux执行sh文件

是否存在而且为非空白文件

-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的条件句型中

脚本接收参数

这基本是必用的功能,我们执行脚本时常常在脚本后直接跟上参数,那我们自己编撰的脚本如何接收参数?

默认参数变量

linux执行sh文件_执行文件查询_执行文件后缀

在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

linux执行sh文件_执行文件后缀_执行文件查询

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 函数名() {
	代码段
}

很标准的句型。

须要注意的是:

执行文件查询_执行文件后缀_linux执行sh文件

函数的定义必须置于函数的使用之前,否则找不到

自定义函数的使用

#!/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参数可以将执行过程全部复印下来

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复