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 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 123,,则 " * " 等价于 "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基础语法的主要内容,如果未能解决你的问题,请参考以下文章

基础的shell脚本

Acwing Linux基础课笔记shell语法

Acwing Linux基础课笔记shell语法

bash shell基础语法

shell 基础语法

(转)Shell基础语法