今天在看一些有关 awk 的资料,然后搜到了这个页面: https://learnxinyminutes.com ,感觉上面的 shell 脚本教程还是挺不错的,正好我没有系统地练习过这些,所以做了一些笔记在这里。

字符串操作

variable="hello world"

# 返回字符串长度
echo ${#variable}

# 从下标为 1 截取到 倒数第一个字符
echo ${variable:1:-1}

# 截取到倒数第五个字符
echo ${variable:-5}

# 字符串替换,把变量 variable 存的字符串内容中的 strA 替换为 strB
echo ${variable/strA/strB}

数组操作

# 数组赋值
array0=(one two three four)

echo $array0

# 按下标获取数组内容
echo ${array0[0]}

# 获取数组全部内容
echo ${array0[@]}

# 获取数组长度
echo ${#array0[@]}

# 返回数组切片
echo ${array0[@]:1:2}

# 内容从 1-6 的数组
echo {1..6}

# 内容从 a-z 的数组
echo {a..z}

for e in {a..z}
do
    echo $e
done

控制流

最基础的就是 if 语句了

if [[ "$Name" == "Steve" ]] && [[ "$Age" -eq 15 ]]
then 
    echo name:$Name age:$Age
fi

需要注意的是, -eq 是用来比较数字大小的,在条件判断中也可以使用 [ ] ,但是 == 要变成 =,因为 == 实际上是 bash 专有语法,需要在 [[ ]] 上下文中使用,(不过现在基本的 shell 都支持了)。

使用 subshell 来管理子命令上下文:

(echo "First, I'm here: $PWD") && (cd someDir; echo "Then, I'm here: $PWD")
当前一个命令运行失败时,用   来运行下一个命令。
echo "Always executed" || echo "Only executed if first command fails"

函数声明

shell 脚本的函数声明和 javascript 很类似

function foo() # 也可以略去 function 关键字
{
    echo "All arguments: $@"
    echo "args: $1 $2..."
    echo "Last program's return value: $?"
    echo "Script's PID: $$"
    echo "Number of arguments passed to script: $#"
    return 0
}

正则

使用 =~ 可以对变量内容进行正则检查:

Email=me@example.com
if [[ "$Email" =~ [a-z]+@[a-z]{2,}\.(com|net|org) ]]
then
    echo "Valid email"
done

实用命令

trap 命令

在收到中断命令后自动执行一段脚本:

trap "echo hello" SIGINT SIGHUP SIGTERM

sed 命令

sed 命令偶尔会用,但是一直不记得语法,每次都要查:

sed -d 's/okay/great/g' file.txt

fgrep 与 grep 命令

fgrep 实际上就是不带正则的 grep,简单示例如下:

fgrep -n text file.txt
grep -rn text *.txt