shell 笔记(Mac 版)

NO.目录
1shell优点
2基本格式
3输出程序 echo
4shell 变量
5引号
6循环
7循环控制
8条件判断
9算数运算
10逻辑运算符
11函数
12字符窜操作
13数组
14重定向
15其他命令

1. shell优点

  1. 语法和结构通常比较简单
  2. 学习和使用通常比较简单
  3. 通常不需要编译
  4. 适合处理文件和目录之类的对象

2. 基本格式

  • 建立一个“test.sh”文件,在文件内输入以下代码
#!/usr/bin/env bash
echo "hello world"

《shell 笔记(Mac 版)》 image.png

3. 输出程序 echo

#!/usr/bin/env bash
echo "hello world"
echo hello world

text="hello world"
echo $text

echo -e "hello \nworld"  #输出并且换行

echo "hello world" > a.txt  #重定向到文件

echo `date`  #输出当前系统时间

《shell 笔记(Mac 版)》 image.png

4. shell 变量

1、只能使用数字,字母和下划线,且不能以数字开头
2、变量名区分大小写
3、“=”前后不能有空格

  • 在“test.sh”文件内,继续输入
#!/usr/bin/env bash
echo "hello world"
myText="hello world"
muNum=100
echo $myText
echo $muNum

echo myText
echo muNum
  • 当想要访问变量的时候,需要使用$,否则输出的将是纯文本内容,如下图所示。

    《shell 笔记(Mac 版)》 image.png

  • 本地变量
    • 只对当前shell进程有效的,对当前进程的子进程和其它shell进程无效。

      《shell 笔记(Mac 版)》 image.png

  • 环境变量(export)
    • 自定义的环境变量对当前shell进程及其子shell进程有效,对其它的shell进程无效

      《shell 笔记(Mac 版)》 image.png

  • 局部变量
      1. 在函数调用时,函数执行结束,变量就会消失
      1. 对shell脚本中某代码片段有效
      1. 定义 local Value_name = Value
  • 位置变量
    • $0: 脚本名称
    • $1:脚本的第一个参数
    • $2:脚本的第二个参数

《shell 笔记(Mac 版)》 image.png

  • 特殊变量
$?接收上一条命令的返回状态码返回状态码在0-255之间
$$获取当前shell的进程号(PID)(可以实现脚本自杀)(或者使用exit命令直接退出也可以使用exit [num])
$!Shell最后运行的后台Process的PID
$-使用Set命令设定的Flag一览
$*所有参数列表。如”$*”用「”」括起来的情况、以”$1 $2 … $n”的形式输出所有参数。
$@所有参数列表。如”$@”用「”」括起来的情况、以”$1″ “$2” … “$n” 的形式输出所有参数。
$#添加到Shell的参数个数
$0Shell本身的文件名
$1~$n添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
#!/usr/bin/env bash
printf "The complete list is %s\n" "$$"
printf "The complete list is %s\n" "$!"
printf "The complete list is %s\n" "$?"
printf "The complete list is %s\n" "$*"
printf "The complete list is %s\n" "$@"
printf "The complete list is %s\n" "$#"
printf "The complete list is %s\n" "$0"
printf "The complete list is %s\n" "$1"
printf "The complete list is %s\n" "$2"

《shell 笔记(Mac 版)》 image.png

5. 引号

  • ”单引号不解析变量
  • “”双引号会解析变量
  • “反引号是执行并引用一个命令的执行结果,类似于$(…)

《shell 笔记(Mac 版)》 image.png

6. 循环

  • for 循环
#!/usr/bin/env bash
# 方法一
for ((i=0;i<10;i++))
do
printf $i
done
echo

# 方法二
for i in 0 1 2 3 4 5 6 7 8 9
do
printf $i
done
echo

# 方法三
for i in {0..9}
do
printf $i
done

《shell 笔记(Mac 版)》 image.png

  • while 循环
#!/usr/bin/env bash
COUNTER=0
while [ $COUNTER -lt 5 ]
do
    COUNTER=`expr $COUNTER + 1`
    echo $COUNTER
done

echo '请输入。。。'
echo 'ctrl + c 即可停止该程序'
while read NUM
do
    echo "Yeah! great NUM the $NUM"
done

《shell 笔记(Mac 版)》 image.png

7. 循环控制

break  #跳出所有循环
break n  #跳出第n层f循环
continue  #跳出当前循环

8. 条件判断

参数解释
-gt大于
-lt小于
-ge大于等于
-le小于等于
-eq等于
-ne不等于
#!/usr/bin/env bash
a=10
b=20
if [ $a -eq $b ]
then
   echo "true"
else
   echo "false"
fi

if [ $a -ne $b ]
then
   echo "true"
else
   echo "false"
fi

if [ $a -gt $b ]
then
   echo "true"
else
   echo "false"
fi

if [ $a -lt $b ]
then
   echo "true"
else
   echo "false"
fi

if [ $a -ge $b ]
then
   echo "true"
else
   echo "false"
fi

if [ $a -le $b ]
then
   echo "true"
else
   echo "false"
fi

《shell 笔记(Mac 版)》 image.png

例如[ $num1 -gt $num2 ]或者test $num1 -gt $num2

#!/usr/bin/env bash
num1=4
num2=5
str1=Alice
str2=Bob
if [ $num1 -gt $num2 ]
then
echo $num1 large than $num2
else
echo $num1 lower than $num2
fi

if [ -z $str1 ]
then
echo str1 is empty
else
echo str is not empty
fi

《shell 笔记(Mac 版)》 image.png

  • if 判断
#!/usr/bin/env bash
a=10
b=20
if [ $a == $b ]
then
   echo "true"
fi


if [ $a == $b ]
then
   echo "true"
else
   echo "false"
fi


if [ $a == $b ]
then
   echo "a is equal to b"
elif [ $a -gt $b ]
then
   echo "a is greater than b"
elif [ $a -lt $b ]
then
   echo "a is less than b"
else
   echo "None of the condition met"
fi

《shell 笔记(Mac 版)》 image.png

  • case 判断
a|ba或者b
*匹配任意长度的任意字符
?匹配任意单个字符
[a-z]指定范围内的任意单个字符
#!/usr/bin/env bash

num=10
case $num in
    1)
        echo 1
            ;;
    2)
        echo 2
            ;;
    10)
        echo 10
            ;;
    *)
        echo somethin else
        ;;
esac

《shell 笔记(Mac 版)》 image.png

9. 算数运算

  • 加减乘除
#!/usr/bin/env bash
echo "Hello World !"
a=3
b=5
val=`expr $a + $b`
echo "Total value : $val"

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

val=`expr $a \* $b`
echo "Total value : $val"

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

《shell 笔记(Mac 版)》 image.png

  • 进行四则运算的时候运算符号前后一定要有空格,乘法的时候需要进行转义。
其他运算符含义
%求余
==相等
=赋值
!=不相等
!
-o
-a
#!/usr/bin/env bash
a=3
b=5
val=`expr $a / $b`
echo "Total value : $val"

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

if [ $a == $b ]
then
   echo "a is equal to b"
fi
if [ $a != $b ]
then
   echo "a is not equal to b"
fi

《shell 笔记(Mac 版)》 image.png

10. 逻辑运算符

-a
-o
#!/usr/bin/env bash

num1=10
num2=20
num3=15
if [ $num1 -lt $num3 -a $num2 -gt $num3 ]
then
        echo $num3 is between 10 and 20
else
        echo something else
fi

《shell 笔记(Mac 版)》 image.png

  • if [ 条件A ] && [条件B ]
  • if((A&&B))
  • if [[ A&&B ]]
#!/usr/bin/env bash

num1=10
num2=20
num3=15
if [[ $num1 -lt $num3 && $num2 -gt $num3 ]]
then
        echo $num3 is between 10 and 20
else
        echo something else
fi

《shell 笔记(Mac 版)》 image.png

11. 函数

#!/usr/bin/env bash
# 定义一个没有返回值的函数,然后调用该函数
sysout(){
    echo "hello world"
}

sysout

# 定一个有返回值的函数,调用该函数,输出结果
test(){

    aNum=3
    anotherNum=5
    return $(($aNum+$anotherNum))
}
test
result=$?
echo $result

《shell 笔记(Mac 版)》 image.png

#!/usr/bin/env bash
# 定义了一个需要传递参数的函数
test(){
    echo $1  #接收第一个参数
    echo $2  #接收第二个参数
    echo $3  #接收第三个参数
    echo $#  #接收到参数的个数
    echo $*  #接收到的所有参数
}
test aa bb cc

《shell 笔记(Mac 版)》 image.png

  • read
    • read命令接收标准输入(键盘)的输入,或者其他文件描述符的输入。得到输入后,read命令将数据放入一个标准变量中。
#!/usr/bin/env bash
read -p "Enter your name:" VAR_NAME
echo "hello $VAR_NAME, welcome to my program"
read -t 10 -p "enter your name:" VAR_NAME
echo "hello $VAR_NAME, welcome to my program"
read  -s  -p "Enter your password: " pass
echo "hello $VAR_NAME, your password is $pass"

《shell 笔记(Mac 版)》 image.png

  • declare
    • 申明变量的类型
declare [-aixr] variable
-i: 把变量定义为整数
-a: 把变量定义为数组
-x: 把变量变成环境变量
-r: 可读变量
ChengkaideMacBook-Pro:~ chengkai$ sum=100+300+50
ChengkaideMacBook-Pro:~ chengkai$ echo $sum
100+300+50           # 文字类型的变量属性无法相加
ChengkaideMacBook-Pro:~ chengkai$ declare -i sum=100+300+50 # -i把变量定义为整数数字
ChengkaideMacBook-Pro:~ chengkai$ echo $sum
450

12. 字符窜操作

str1="Hello"
str2="World"

echo ${#str1} # 输出字符窜长度
echo ${str1:0:3} # 截取字符窜
echo $str1" "$str2 # 字符窜拼接

《shell 笔记(Mac 版)》 image.png

13. 数组

#!/usr/bin/env bash
array=(1 2 3 4 5)  #定义数组
array2=(aa bb cc dd ee)  #定义数组
value=${array[3]}  #找到某一个下标的数,然后赋值
echo $value  #打印
value2=${array2[3]}  #找到某一个下标的数,然后赋值
echo $value2  #打印
length=${#array[*]}  #获取数组长度
echo $length

《shell 笔记(Mac 版)》 image.png

14. 重定向

命令说明
command > file将输出重定向到 file。
command < file将输入重定向到 file。
command >> file将输出以追加的方式重定向到 file。
n > file将文件描述符为 n 的文件重定向到 file。
n >> file将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m将输出文件 m 和 n 合并。
n <& m将输入文件 m 和 n 合并。
<< tag将开始标记 tag 和结束标记 tag 之间的内容作为输入。
/dev/null禁止输出
  • 注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
$echo result > file  #将结果写入文件,结果不会在控制台展示,而是在文件中,覆盖写
$echo result >> file  #将结果写入文件,结果不会在控制台展示,而是在文件中,追加写
echo input < file  #获取输入流
$ command > file 2>&1 # 将 stdout 和 stderr 合并后重定向到 file,
$ command < file1 >file2 # command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。

15. 其他命令

  • date
    • 格式化输出 +%Y-%m-%d
    • 格式%s表示自1970-01-01 00:00:00以来的秒数
#!/usr/bin/env bash
echo `date +%Y-%m-%d-%H:%M:%S`
echo `date +%s`
  • 后台运行脚本
bash test.sh &
  • 不挂断的运行命令
nohup test.sh & 

参考文献

  1. http://www.jianshu.com/p/71cb62f08768
  2. http://blog.csdn.net/u011204847/article/details/51184883
    原文作者:thinkando
    原文地址: https://www.jianshu.com/p/f7ef4f95f5c6
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞