shell核心语法

第一个shell

#!/bin/bash
echo "Hello World !"
  • #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。
  • 运行
    • chmod +x ./test.sh #使脚本具有执行权限
    • ./test.sh #执行脚本

变量

字符串

your_name="qinjx"
echo $your_name
echo ${your_name}

your_name='runoob'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str
  • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
  • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
  • 双引号里可以有变量
  • 双引号里可以出现转义字符
  • 获取字符串长度
string="abcd"
echo ${#string} #输出 4
  • 提取子字符串
string="runoob is a great site"
echo ${string:1:4} # 输出 unoo
  • 查找子字符串
string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4

数组

  • 支持一维数组,不支持多维数组
  • 用括号来表示数组,数组元素用"空格"符号分割开
array_name=(value0 value1 value2 value3)

array_name=(
value0
value1
value2
value3
)

array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
  • 读取数组
valuen=${array_name[n]}
  • 使用 @ 符号可以获取数组中的所有元素
echo ${array_name[@]}
  • 获取数组的长度
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

传递参数

  • 向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推
  • shell脚本传递的参数中如果包含空格,应该使用单引号或者双引号将该参数括起来,以便于脚本将这个参数作为整体来接收
echo "Shell 传递参数实例!";
echo "第一个参数为:$1";

echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";

括号用法

  • 算术比较:-gt-lt-ge-le-eq-ne,可以通过 -a (and) 或 -o (or) 结合多个条件
[ $var -eq 0 ]  # 当 $var 等于 0 时,返回真
[ $var -ne 0 ]  # 当 $var 不等于 0 时,返回真

[ $var1 -ne 0 -a $var2 -gt 2 ]  # 使用逻辑与 -a
[ $var1 -ne 0 -o $var2 -gt 2 ]  # 使用逻辑或 -o
  • 字符串比较,注意 = 前后有一个空格
[[ $str1 = $str2 ]]

str1="Not empty"
str2=""
if [[ -n $str1 ]] && [[ -z $str2 ]];
then
  echo str1 is nonempty and str2 is empty string.
fi

基本运算符

  • expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
    • 表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2
    • 完整的表达式要被 包含,注意这个字符不是常用的单引号
val=`expr 2 + 2`
echo "两数之和为 : $val"

echo

  • 显示结果定向至文件
echo "It is a test" > myfile

printf

  • printf 使用引用文本或空格分隔的参数,外面可以在 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 
  • %s %c %d %f都是格式替代符
  • %-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充
  • %-4.2f 指格式化为小数,其中.2指保留2位小数。

test 命令

  • test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试
num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

流程控制

if-else

if condition
then
    command1 
    command2
    ...
    commandN 
fi
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo '两个数字相等!'
else
    echo '两个数字不相等!'
fi

for 循环

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done
for((i=1;i<=5;i++));do
    echo "这是第 $i 次调用";
done;

while 语句

while condition
do
    command
done
#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

until 循环

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

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命令允许跳出所有循环(终止执行后面的所有循环)
  • continue命令不会跳出所有循环,仅仅跳出当前循环

函数

  • 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
  • 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。
  • 函数返回值在调用该函数后通过 ? 来 获 得 , ? 来获得, ?,? 仅对其上一条指令负责,一旦函数返回后其返回值没有立即保存入参数,那么其返回值将不再能通过 $? 获得
  • 所有函数在使用前必须定义
[ function ] funname [()]

{

    action;

    [return int;]

}
funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
  • 调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值
  • 10 不 能 获 取 第 十 个 参 数 , 获 取 第 十 个 参 数 需 要 10 不能获取第十个参数,获取第十个参数需要 10{10}。当n>=10时,需要使用${n}来获取参数
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: 将输出重定向到 file
  • command < file: 将输入重定向到 file
  • command >> file: 将输出以追加的方式重定向到 file
  • command > /dev/null:/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃,将命令的输出重定向到它,会起到"禁止输出"的效果。

文件包含

  • Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件
. filename   # 注意点号(.)和文件名中间有一空格

或

source filename
#!/bin/bash

#使用 . 号来引用test1.sh 文件
. ./test1.sh

# 或者使用以下包含文件代码
# source ./test1.sh

echo "$url"
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值