目录

Linux Shell 脚本入门

目录

一直学下 Shell 脚本的,借鉴了很多大佬的脚本,靠着 Google 写「Ctrl+C / V」了个 Demo 出来。

直接放脚本,Mark 一下防止以后忘记…

复制脚本内容,保存为 *.sh 文件,运行 bash *.sh 结合查看脚本的输出情况来理解命令更佳。

#!/bin/bash
:<<EOF
这是多行注释区块

$0	当前脚本的文件名
$n	传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#	传递给脚本或函数的参数个数。
$*	传递给脚本或函数的所有参数。
$@	传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?	上个命令的退出状态,或函数的返回值。
$$	当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。

EOF

str="frist shell script"

#字符串拼接
echo "1:do u know this is my $str"

#字符串长度
echo "2:${#str}"

#提取子字符串
echo "3:${str:1:4}"

#查找子字符串 查找字符 i 或 s 的位置(哪个字母先出现就计算哪个)
echo "4:`expr index "$str" is`"



#数组定义
array_test=(1 'A' 2 4)

#获取数组元素值
echo "5:${array_test[0]}"
echo "6:${array_test[1]}"
echo "7:${array_test[*]}"
echo "8:${array_test[@]}"

#获取数组的长度
echo "9:${#array_test[@]}"


#加法运算
val=`expr 2 + 2`
echo "10:两数之和为 : $val"

#在当前目录下生成log文件
log_path="test.log"
echo "11:往当前目录下的log文件写入内容,如果文件不存在则自动创建。"
#如果不希望文件内容被覆盖,可以使用 >> 追加到文件末尾
echo "It is a test" > $log_path

#显示命令执行结果
echo "12:显示命令执行结果 ls"
echo `ls`

:<<EOF
%s %c %d %f都是格式替代符

%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内
如果不足则自动以空格填充,超过也会将内容全部显示出来。

%-4.2f 指格式化为小数,其中.2指保留2位小数。
EOF
#printf显示表格
echo -e "13:printf显示表格"
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 

# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
echo -e "14:format-string 重用"
printf "%s\n" abc df
printf "%s %s %s\n" a b c d e f g h i j



#if
echo "14:if语句"
a=102
b=101
if [ $a -eq $b ]
then
    echo '两个数相等!'
elif [ $a -gt $b ]
then
    echo 'a大于b!'
else
    echo 'a小于b!'
fi

a=101
b=101
if [[ $a > $b || $a == $b ]]
then
	echo 'c大等于d'
else
	echo 'c小于d'
fi

#字符串比较
c='sss'
d='sss'
if [[ $c == $d ]]
then
	echo 'c和d相等!'
else
	echo 'c和d不相等!'
fi

#for循环
echo -e "15:for循环输出数组内的所有元素"
for vo in ${array_test[*]}
do
    echo $vo
done

#while循环
echo -e "15:while循环输出数组内的所有元素"
array_length=${#array_test[*]}
temp=1
while [ $temp -lt $array_length ]
do
    echo $temp
    let "temp++"
done

#until循环
#until 循环执行一系列命令直至条件为 true 时停止。
temp=1
echo "16:until循环输出数组内的所有元素"
until [ $temp -eq $array_length ]
do
    echo $temp
    let "temp++"
done


#读取用户输入
echo "17:读取用户输入"
echo && read -e -p "请输入数字 [1-4]:" aNum
case $aNum in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac


#函数定义 调用
echo "18:函数定义 调用"
demoFun(){
    echo "这是我的第一个 shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"