美文网首页
Shell学习记录

Shell学习记录

作者: Jorvi | 来源:发表于2018-07-27 15:24 被阅读0次

1. Hello World

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

运行:

  • cd 到该目录下
  • chmod +x ./test.sh 给脚本权限
  • ./test.sh 执行脚本

2. Shell变量

定义:变量名不加美元符号($)

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线(_)。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。
# 注意=两边不能有空格
a="aaa"

使用:在变量名前面加美元符号($)即可使用

# 两种方法
echo $a
echo ${a}

只读变量

# 将变量a定义为只读变量,只读变量不能改变
readonly a

删除变量

# 只读变量无法删除
unset b

字符串

# 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的
# 单引号字串中不能出现单引号(对单引号使用转义符后也不行)
str='this is a string'

# 双引号里可以有变量
# 双引号里可以出现转义字符
str2="hello, ${a}"

3. Shell参数传递

在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。

#!/bin/bash
echo "执行的文件名:$0";
echo "第一个参数为:$1";

4. Shell数组

#!/bin/bash

# 定义数组
my_array=(A B "C" D)

# 按下标取值
echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"

# 数组中所有元素
echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"

# 数组长度
echo "数组元素个数为: ${#my_array[*]}"
echo "数组元素个数为: ${#my_array[@]}"

5. Shell运算

算数运算

  • 运算符左右必须有空格
  • 完整的表达式要被反引号(``)包含
#!/bin/bash

a=10
b=20

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"

if [ $a == $b ]; then
   echo "a 等于 b"
fi

if [ $a != $b ]; then
   echo "a 不等于 b"
fi

关系运算
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

#!/bin/bash

a=10
b=20

if [ $a -eq $b ]; then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi

if [ $a -ne $b ]; then
   echo "$a -ne $b: a 不等于 b"
else
   echo "$a -ne $b : a 等于 b"
fi

if [ $a -gt $b ]; then
   echo "$a -gt $b: a 大于 b"
else
   echo "$a -gt $b: a 不大于 b"
fi

if [ $a -lt $b ]; then
   echo "$a -lt $b: a 小于 b"
else
   echo "$a -lt $b: a 不小于 b"
fi

if [ $a -ge $b ]; then
   echo "$a -ge $b: a 大于或等于 b"
else
   echo "$a -ge $b: a 小于 b"
fi

if [ $a -le $b ]; then
   echo "$a -le $b: a 小于或等于 b"
else
   echo "$a -le $b: a 大于 b"
fi

布尔运算

#!/bin/bash

a=10
b=20

# 与运算
if [ $a -lt 100 -a $b -gt 15 ]; then
   echo "$a 小于 100 且 $b 大于 15 : 返回 true"
else
   echo "$a 小于 100 且 $b 大于 15 : 返回 false"
fi

# 或运算
if [ $a -lt 100 -o $b -gt 100 ]; then
   echo "$a 小于 100 或 $b 大于 100 : 返回 true"
else
   echo "$a 小于 100 或 $b 大于 100 : 返回 false"
fi

逻辑运算

#!/bin/bash

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

字符串运算

#!/bin/bash

a="abc"
b="efg"

if [ $a = $b ]; then
   echo "$a = $b : a 等于 b"
else
   echo "$a = $b: a 不等于 b"
fi

if [ $a != $b ]; then
   echo "$a != $b : a 不等于 b"
else
   echo "$a != $b: a 等于 b"
fi

if [ -z $a ]; then
   echo "-z $a : 字符串长度为 0"
else
   echo "-z $a : 字符串长度不为 0"
fi

if [ -n "$a" ]; then
   echo "-n $a : 字符串长度不为 0"
else
   echo "-n $a : 字符串长度为 0"
fi

if [ $a ]; then
   echo "$a : 字符串不为空"
else
   echo "$a : 字符串为空"
fi

文件检测运算

#!/bin/bash

file="/var/www/runoob/test.sh"

if [ -r $file ]; then
   echo "文件可读"
else
   echo "文件不可读"
fi

if [ -w $file ]; then
   echo "文件可写"
else
   echo "文件不可写"
fi

if [ -x $file ]; then
   echo "文件可执行"
else
   echo "文件不可执行"
fi

if [ -f $file ]; then
   echo "文件为普通文件"
else
   echo "文件为特殊文件"
fi

if [ -d $file ]; then
   echo "文件是个目录"
else
   echo "文件不是个目录"
fi

if [ -s $file ]; then
   echo "文件不为空"
else
   echo "文件为空"
fi

if [ -e $file ]; then
   echo "文件存在"
else
   echo "文件不存在"
fi

6. Shell显示

echo命令

#!/bin/sh

# 从标准输入中读取一行,并赋给变量a
read a
# 输出变量a
echo "$a"

# -e 开启转义
echo -e "OK! \n GO" 

# 结果定向到文件
echo "It is a test" > myfile

# 输出执行结果(当前时间)
echo `date`

printf命令

#!/bin/bash

# 输出 1 abc
printf "%d %s\n" 1 "abc"

7. test命令

test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

# [] 执行基本的算数运算
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]; then
    echo '两个数字相等!'
else
    echo '两个数字不相等!'
fi

8. 流程控制

if else

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 loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

while循环

echo '按下 <CTRL-D> 退出'
echo -n '输入: '
while read a
do
    echo "$FILM"
done

跳出循环
break:直接跳出循环体
continue:不跳出循环体,结束当前循环,继续下一次循环

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

9. 函数

有返回值

#!/bin/bash

funWithReturn(){
    echo "这个函数会对输入的两个数字进行相加运算..."
    echo "输入第一个数字: "
    read aNum
    echo "输入第二个数字: "
    read anotherNum
    echo "两个数字分别为 $aNum 和 $anotherNum !"
    return $(($aNum+$anotherNum))
}

# 先定义,后使用
funWithReturn
# 调用函数后,通过 $? 来获得该函数返回值
echo "输入的两个数字之和为 $?"

有参数

#!/bin/bash

funWithParam(){
    echo "第一个参数为 $1"
    echo "第二个参数为 $2"
    
    # 当n>=10时,需要使用${n}来获取参数。
    echo "第十个参数为 ${10}"
    echo "第十一个参数为 ${11}"
    echo "参数总数有 $# 个"
    echo "作为一个字符串输出所有参数 $* "
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

10. 重定向

输出重定向

# 结果写入文件,控制台不显示(覆盖方式)
echo "aaa" > file

# 结果写入文件,控制台不显示(追加方式)
echo "aaa" >> file

# 控制台不显示,内容也不写入文件
echo "aaa" > /dev/null

输入重定向

# 从文件读取输入
echo input < file

11. 文件包含

将a.sh加入b.sh中,即可在b.sh中使用a.sh中的内容

# 方法一
# 注意点号(.)和文件名中间有一空格
. filename  

# 方法二
source filename

12. 调试shell脚本

sh -x test.sh

相关文章

  • Shell学习记录

    1. Hello World 运行: cd 到该目录下 chmod +x ./test.sh 给脚本权限...

  • 子Shell脚本实现方式1-来自《跟老男孩学Linux运维:Sh

    [记录备忘][研究学习]通过Shell脚本来实现一个由“&”产生的子Shell

  • shell正则

    学习的内容来自于Linux Shell脚本攻略(2) 内容只做了简单的记录,方便自己学习 shell 命令查询地址...

  • shell文件归档

    学习的内容来自于Linux Shell脚本攻略(2) 内容只做了简单的记录,方便自己学习 shell 命令查询地址...

  • shell三剑客之sed

    学习的内容来自于Linux Shell脚本攻略(2) 内容只做了简单的记录,方便自己学习 shell 命令查询地址...

  • shell命令(2)

    学习的内容来自于Linux Shell脚本攻略(2) 内容只做了简单的记录,方便自己学习 shell 命令查询地址...

  • shell命令(1)

    学习的内容来自于Linux Shell脚本攻略(2) 内容只做了简单的记录,方便自己学习 shell 命令查询地址...

  • shell三剑客之awk

    学习的内容来自于Linux Shell脚本攻略(2) 内容只做了简单的记录,方便自己学习 shell 命令查询地址...

  • shell三剑客之grep

    学习的内容来自于Linux Shell脚本攻略(2) 内容只做了简单的记录,方便自己学习 shell 命令查询地址...

  • Linux中的磁盘管理

    学习的内容来自于Linux Shell脚本攻略(2) 内容只做了简单的记录,方便自己学习 shell 命令查询地址...

网友评论

      本文标题:Shell学习记录

      本文链接:https://www.haomeiwen.com/subject/smkimftx.html