wuyuedefeng / blogs

博客文章在issue中
5 stars 0 forks source link

Bash基础 #123

Open wuyuedefeng opened 3 years ago

wuyuedefeng commented 3 years ago

Example

#!/bin/bash
echo "Hello World !"

变量

> 数组
用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:`数组名=(值1 值2 ... 值n)`
```bash
#!/bin/bash
array_name=(0 1 2 3)
# 读取数组: ${数组名[下标]}
value0=${array_name[0]}
echo ${array_name[@]} # 使用 @ 符号可以获取数组中的所有元素
# 获取数组的长度
length=${#array_name[@]} # 或 length=${#array_name[*]}
# 取得数组单个元素的长度
# lengthn=${#array_name[n]}

注释


#!/bin/bash
# 这是一个注释
# ----------------

多行注释

:<<EOF 注释内容... 注释内容... 注释内容... EOF

EOF 也可以换成其他符号, eg: !

:<<! 注释内容... 注释内容... 注释内容... !


# [传递参数](https://www.runoob.com/linux/linux-shell-passing-arguments.html)
```bash
#!/bin/bash

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";

:<<EOF
$* 与 $@ 区别:
相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)。
EOF

echo "-- \$* 演示 ---"
for i in "$*"; do
    echo $i
done

echo "-- \$@ 演示 ---"
for i in "$@"; do
    echo $i
done
### 执行test.sh
$ chmod +x test.sh 
$ ./test.sh 1 2 3

基本运算符

echo命令

printf 命令

test 命令(检查某个条件是否成立)

流程控制

if else

#!/bin/bash
# 一行写法
if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

# 多行写法
a=10
b=20
if [ $a == $b ]
then
   echo "a 等于 b"
elif [ $a -gt $b ]
then
   echo "a 大于 b"
elif [ $a -lt $b ]
then
   echo "a 小于 b"
else
   echo "没有符合的条件"
fi

for 循环

for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done

#!/bin/bash
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
# 顺序输出字符串中的字符
for str in This is a string
do
echo $str
done

输出

This

is

a

string


> while 语句

```bash
#!/bin/bash
# int 从 1 开始,每次循环处理时,int 加 1, 返回数字 1 到 5,然后终止
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

# 输入信息被设置为变量FILM,按<Ctrl-D>结束循环
echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
    echo "是的!$FILM 是一个好网站"
done

until 循环

#!/bin/bash
# until 命令来输出 0 ~ 9 的数字
a=0

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

case ... esac case 工作方式如上所示,取值后面必须为单词 in,每一模式必须以右括号结束。取值可以为变量或常数,匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。

#!/bin/bash
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

跳出循环


#!/bin/bash

break命令

while : do echo -n "输入 1 到 5 之间的数字:" read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的! 游戏结束" break ;; esac done

continue

while : do echo -n "输入 1 到 5 之间的数字: " read aNum case $aNum in 1|2|3|4|5) echo "你输入的数字为 $aNum!" ;; *) echo "你输入的数字不是 1 到 5 之间的!" continue echo "游戏结束" ;; esac done


# [函数](https://www.runoob.com/linux/linux-shell-func.html)
1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)
```bash
#!/bin/bash

# base func
demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"

# 返回值
funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !" # 函数返回值在调用该函数后通过 $? 来获得。

# 函数参数
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