shell 简单使用说明

124 阅读1分钟

shell脚本文件

运行

.sh后缀不是必须的

# 方法1 
sh hello.sh  

# 方法2 
chmod +x hello.sh 
./hello.sh
解释器

第一行需要约定解释器, #! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。

#!/bin/bash

变量

定义变量时,变量名不加美元符号;使用变量时,前面加 $ 符号,大括号可有可无,视具体情况。

echo 输出变量

unset 删除变量

your_name="runoob.com"

echo $your_name
echo ${your_name}

unset your_name
字符串

单引号 引号内的内容原封不动输出,单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

双引号内可以有变量,可以出现转义符

获取字符串长度 #,例如 ${#str}

str='this is a string'
your_name="runoob"
str="Hello, I know you are "$your_name"! \n"
echo -e $str
echo ${#str}
数组

定义:格式如 数组名=(值1 值2 ... 值n),值之间用空格隔开 单独定义数组的各个分量:array_name[0]=value0 可以不使用连续的下标,而且下标的范围没有限制。

读取数组:一般格式是 ${数组名[下标]} ,下标[n]或[*]表示全部元素

获取数组长度 #,例如 ${#array_name[*]}

array_name=(value0 value1 value2 value3)
array_name[0]=value0
valuen=${array_name[n]}
echo ${array_name[@]}
echo ${#array_name[*]}
关联数组

类似map,以字符串或整数作为访问数组的key,使用 declare -A 命令来声明

declare -A array_name
declare -A site=(["google"]="www.google.com", ["runoob"]="www.runoob.com", ["taobao"]="www.taobao.com")

# 也可以先声明后赋值
declare -A site
site["google"]="www.google.com"

#使用
echo ${site["google"]}

注释

单行注释 # 开头

段落注释:#后一对花括号

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

shell 传递参数

0 为执行的文件名(包含文件路径);1为传递的第一个参数,依次类推;$#为传递的参数个数。

注意,10 不能获取第十个参数,获取第十个参数需要{10}。当n>=10时,需要使用${n}来获取参数。

传递的所有参数: * 以"1 2 … n"的形式输出所有参数 @ 以"1" "2" … "n" 的形式输出所有参数

# 使用$* 
for i in "$*" 
do     
    echo "the arg is $i" 
done 
echo "=================="  

# 使用$@ 
for j in "$@" 
do     
    echo "the arg is $j" 
done

# 输出结果
the arg is 1 2 3 
================== 
the arg is 1 
the arg is 2 
the arg is 3

条件语句

if-else

如果使用 ((...)) 作为判断语句,大于和小于可以直接使用 ><

if else 的 [...] 判断语句中大于使用 -gt,小于使用 -lt

if condition
then
    command1
    ...
    commandN
elif condition2 
then
    command2
else
    command
fi

# 示例
if [ "$a" -gt "$b" ]; then
    ...
fi

if (( a > b ))
then
    ...
fi
test命令

test 命令用于检查某个条件是否成立

数值测试,符号按下表

![image20220718114129665](file:///Users/wzz/Library/Application Support/typora-user-images/image-20220718114129665.png?msec=1672495083344)

字符串测试

![image20220718184136160](file:///Users/wzz/Library/Application Support/typora-user-images/image-20220718184136160.png?msec=1672495083344)

num1=100
num2=100

if test $[num1] -eq $[num2]  #或者这么写 if (( $num1 == $num2 ))
then
    echo '两个数相等!'
fi
# 代码中的 [] 执行基本的算数运算,注意等号两边不能有空格
result=$[num1+num2]
echo "result 为: $result"

num1="ru1noob"
num2="runoob"
if test $num1 = $num2  #或者这么写 if [ $num1 == $num2 ]
then
    echo '两个字符串相等!'
else
    echo '两个字符串不相等!'
fi
for循环
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

GROUP=('test' 'wzz' 'hhh')
for item in ${REVIEW_GROUP[*]}
do
  echo "循环REVIEW_GROUP: $item"
  if test $1 = $item
  then
    echo "相等$item"
    res=$item
    break
  else
    echo "不相等$item"
  fi
done

函数

函数定义格式如下

  • 可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
  • 参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。
[ function ] funname [()]
{
    action;
    [return int;]
}

函数参数:同脚本参数,常用# * @ 1...$n等

? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。? 仅对其上一条指令负责,一旦函数返回后其返回值没有立即保存入参数,那么其返回值将不再能通过 $? 获得。

function demoFun1(){
    echo "这是我的第一个 shell 函数!"
    return `expr 1 + 1`
}

demoFun1
echo $?
echo $?

# 以下是输出结果
这是我的第一个 shell 函数!
2
0

运算符

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。如果不放在引号里,直接使用是会输出的。

例如,两个数相加(注意使用的是反引号 **` 而不是单引号 * '*** ):

expr 111 + 111 # 会打印出222

val=`expr 2 + 2`
echo "两数之和为 : $val"
val=`expr $a + $b`
echo "a + b : $val"

val=`expr $a - $b`
echo "a - b : $val"

val=`expr $a * $b`
echo "a * b : $val"

val=`expr $b / $a`
echo "b / a : $val"

val=`expr $b % $a`
echo "b % a : $val"

vim快捷键

快捷键操作
$跳到行尾
跳到行首
dd删除当前行
ndd删除n行
cc删除当前行并进入编辑模式
u撤销