dev

Shell Cmd - Shell Script

/note-bak/dev/shell/script/

About Linux

What is Linux?

  • Free
  • Unix Like
  • Open Source
  • Network oprating system

Where can I use Linux?

  • Linux Server
  • Standalone workstation/PC

What is Kernal?

  • Kernel is heart of Linux Os.
  • It acts as an intermediary between the computer hardware and various programs/application/shell.

Shell and Shell Script

Shell 是一个用 C 语言编写的程序,它提供了一个界面,用户可以通过这个界面访问操作系统的内核服务。

Shell 脚本(shell script),是一种为 shell 编写的脚本程序。它可以通过解释器来执行。

Shell Interpreters

Linux 有很多 Shell 解释器,如下:

  • Bourne Shell(/usr/bin/sh或/bin/sh)
  • Bourne Again Shell(/bin/bash)
  • C Shell(/usr/bin/csh)

一般在 Shell 脚本的第一行,会指明用哪个解释器。

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

Executing Shell Scripts

两种方法:

  • 作为可执行程序。
chmod +x ./test.sh
./test.sh
  • 作为解释器参数。
/bin/sh test.sh

Shell Comments

以”#“开头的行就是注释,没有多行注释。

如果需要临时注释大段代码,可以将其用花括号括起来,当作未被调用的函数。

Shell Variables

定义变量

注:变量名和等号之间不能有空格。

your_name="alice"

使用变量

在变量名前面加美元符号即可,变量名外面的花括号是可选的,加花括号是为了帮助解释器识别变量的边界。

your_name="alice"
echo $your_name
echo ${your_name}

Shell Strings

单引号 v.s. 双引号

  • 单引号里的任何字符都会原样输出。
  • 双引号里可以有变量和转义字符。

常见字符串操作

your_name="alice"

# 拼接字符串,直接拼接,不需要用+
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"

# 获取字符串长度
echo ${#your_name} #输出 5

# 提取子字符串
echo ${alice:1:4} # 输出 lice

Shell Arrays

用括号来表示数组,数组元素用”空格”符号分割开

# 定义数组
array_name=(value0 value1 value2 value3)

# 读取数组
valuen=${array_name[1]} # 输出 value1

# 获取数组中的所有元素
echo ${array_name[@]}

Shell Command Line Arguments

  • $n:引用某个传入的参数,n从1开始计数。
  • $#:传递到脚本的参数个数。
  • $*:以一个单字符串显示所有向脚本传递的参数。
# 定义脚本
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";

# 调用
$ ./test.sh 1 2 3

Shell Basic Operators

算术运算符

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

# 注意1:使用的是反引号 ` 而不是单引号 '
# 注意2:表达式和运算符之间要有空格
# 加
val=`expr $a + $b`
# 减
val=`expr $a - $b`
# 乘
val=`expr $a \* $b`
# 除
val=`expr $b / $a`
# 取余
val=`expr $b % $a`

关系运算符

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

if [ $a -eq $b ] # 等于
if [ $a -ne $b ] # 不等于
if [ $a -gt $b ] # 大于
if [ $a -lt $b ] # 小于
if [ $a -ge $b ] # 大于等于
if [ $a -le $b ] # 小于等于

布尔/逻辑运算符

# 非运算
if [ $a != $b ]
# 逻辑的 AND
if [[ $a -lt 100 && $b -gt 100 ]]
# 逻辑的 OR
if [[ $a -lt 100 || $b -gt 100 ]]

字符串运算符

# 两个字符串相等
if [ $a = $b ]
# 两个字符串不相等
if [ $a != $b ]
# 字符串长度为0
if [ -z $a ]
# 字符串长度不为0
if [ -n $a ]
# 字符串不为空
if [ $a ]

文件测试运算符

# 文件是个目录
if [ -d $file ]
# 文件不为空
if [ -s $file ]
# 文件存在
if [ -e $file ]

Shell Flow Control

if-else

注:方括号和判断条件之间要加空格。不允许空的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 str in 'This is a string'
do
    echo $str
done

while 循环

int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

Shell Functions

  • 定义:fun()或者function fun()。
  • 传参:定义函数时不用带任何参数,使用时用$n来获取传入参数。
  • 返回值:可以用return返回一个值,如果没有return,将以最后一条命令运行结果作为返回值。使用时用$?来获取返回值。
  • 使用:直接调用函数名+参数来使用函数,不需要括号。
firstFun(){
    echo "Hello World!"
}

function secondFunAdd(){
   echo "p1: $1"
   echo "p2: $2"
   return $1+$2
}

secondFunAdd 11 22
echo "p1 + p2 = $?"

Shell Input/Output Redirection

输出重新定向

# 执行command然后将输出的内容存入file
command > file

# 将用户信息存入users
who > users

# 以追加形式将echo的内容写入file
echo "123" >> file

输入重新定向

# 从file获取值,作为command的输入
command < file

# 将stdout和stderr合并后追加写入file
command >> file 2>&1

/dev/null文件

# 如果想要执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到/dev/null
command > /dev/null

Shell File Sourcing

  • . filename,注意点号(.)和文件名中间有一空格
  • source filename