shell基础语法
Posted 行走江湖的码农
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell基础语法相关的知识,希望对你有一定的参考价值。
shell基础语法
基础:
#!/bin/sh
必须以这个开头
echo "Hello World !"
执行脚本
chmod +x ./test.sh #使脚本具有执行权限
./test.sh #执行脚本
或者 (解释器脚本)
/bin/sh test.sh
/bin/php test.php
就是如何简单粗暴
变量:
your_name="runoob.com"
变量之间不能有空格
命名规则跟其他语言大体类似
your_name="qinjx"
echo $your_name
echo $your_name
使用变量
变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:
for skill in Ada Coffe Action Java; do
echo "I am good at $skillScript"
done
for file in `ls /etc`
以上语句将 /etc 下目录的文件名循环出来。
只读变量
#!/bin/bash
myUrl="http://www.w3cschool.cc"
readonly myUrl
myUrl="http://www.runoob.com"
执行脚本会报错 /bin/sh: NAME: This variable is read only.
删除变量
unset variable_name
单引号字串中不能出现单引号(对单引号使用转义符后也不行)。
字符串拼接
your_name="qinjx"
greeting="hello, "$your_name" !"
greeting_1="hello, $your_name !"
echo $greeting $greeting_1
截取字符串
string="runoob is a great site"
echo $string:1:4 # 输出 unoo
查找字符串
string="runoob is a great company"
echo `expr index "$string" is` # 输出 8 注意:注意: 以上脚本中 "`" 是反引号,而不是单引号 "'",不要看错了哦。
数组:
array_name=(value0 value1 value2 value3)
array_name=(
value0
value1
value2
value3
)
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
输出数组所有元素
echo $array_name[@]
获取数组长度和数组单元长度
# 取得数组元素的个数
length=$#array_name[@]
# 或者
length=$#array_name[*]
# 取得数组单个元素的长度
lengthn=$#array_name[n]
注释
以"#"开头的行就是注释,会被解释器忽略。
第二章节
脚本 传递参数
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
$ chmod +x test.sh
$ ./test.sh 1 2 3
参数处理 说明
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。
如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
$* 与 $a 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
echo "-- \\$* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- \\$@ 演示 ---"
for i in "$@"; do
echo $i
done
执行脚本,输出结果如下所示:
$ chmod +x test.sh
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3
============算数运算符号==================
val=`expr 2 + 2`
echo "两数之和为 : $val"
注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]。
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
==============布尔=====================
a=10
b=20
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a != $b: a 等于 b"
fi
==========逻辑运算符==================
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi
echo使用
echo "\\"It is a test\\""
输出结果"It is a test"
read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量
#!/bin/sh
read name
echo "$name It is a test"
[root@www ~]# sh test.sh
OK #标准输入 用户输入
OK It is a test #输出结果
echo -e "OK! \\n" # -e 开启转义
echo "It it a test"
echo -e "OK! \\c" # -e 开启转义 \\c 不换行
echo "It is a test" > myfile
echo `date`
系统变量
sprintf
%s %c %d %f都是格式替代符
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。
printf "%-10s %-8s %-4s\\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\\n" 郭芙 女 47.9876
Test命令
文件测试
参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
cd /bin
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
流程控制
if condition
then
command1
command2
...
commandN
fi
或者
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi
for循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
while 语法
#!/bin/sh
int=1
while(( $int<=5 ))
do
echo $int
let "int++"
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的电影名: '
while read FILM
do
echo "是的!$FILM 是一部好电影"
done
运行脚本,输出类似下面:
按下 <CTRL-D> 退出
输入你最喜欢的电影名: w3cschool菜鸟教程
是的!w3cschool菜鸟教程 是一部好电影
无限循环
无限循环语法格式:
while :
do
command
done
死循环
while :
do
command
done
或者
for (( ; ; ))
case分支
echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read aNum
case $aNum in
1) echo '你选择了 1'
;;
2) echo '你选择了 2'
;;
3) echo '你选择了 3'
;;
4) echo '你选择了 4'
;;
*) echo '你没有输入 1 到 4 之间的数字'
;;
esac
break跳出
while :
do
echo -n "输入 1 到 5 之间的数字:"
read aNum
case $aNum in
1|2|3|4|5) echo "你输入的数字为 $aNum!"
;;
*) echo "你输入的数字不是 1 到 5 之间的! 游戏结束"
break
;;
esac
自定义函数
demoFun()
echo "这是我的第一个 shell 函数!"
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
使用函数: doneFun
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
funWithReturn()
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
funWithReturn
echo "输入的两个数字之和为 $? !"
funWithReturn
函数带参数
funWithParam()
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 $10 !"
echo "第十一个参数为 $11 !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
funWithParam 1 2 3 4 5 6 7 8 9 34 73
重定向
$ command >> file 2>&1
多个文件
特俗定界符
command << delimiter
document
delimiter
done
$ wc -l << EOF
欢迎来到
菜鸟教程
www.runoob.com
EOF
3 # 输出结果为 3 行
$
文件包含
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
url="http://www.runoob.com"
test2.sh 代码如下:
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com
#使用 . 号来引用test1.sh 文件
. ./test1.sh
# 或者使用以下包含文件代码
# source ./test1.sh
echo "菜鸟教程官网地址:$url"
接下来,我们为 test2.sh 添加可执行权限并执行:
$ chmod +x test2.sh
$ ./test2.sh
以上是关于shell基础语法的主要内容,如果未能解决你的问题,请参考以下文章