x=10 y=10 if [[ $x -gt $y ]] then echo 'x > y' else echo 'y > x' fi
判空方法就比较多了:
1 2 3 4
if [[ ! $x ]] if [[ ! -n "$x" ]] if [[ test -z $x ]] if [[ "$x" == "" ]]
case 语句
1 2 3 4 5 6 7 8 9 10 11 12
x=1 case $x in 1) echo 'x=1' ;; 2) echo 'x=2' ;; *) echo 'nothing' ;; esac
while 循环语句
1 2 3 4 5 6
i=0 while [[ $i -lt 10 ]] do echo $i i=$(($i+1)) done
遍历一个列表:
1 2 3 4 5 6 7 8 9
i=0 while true; do # 提取列表中一个item数据,根据数据格式不同,提取方式会有变化,下面以读取json文件为例: item=$(./jq --argjson i $i -r '.items[$i]' data.json) if [[ "$item" == "" || "$item" == "null" ]]; then break fi echo $item done
for 循环语句
1 2 3 4
for i in 1 2 3 do echo $i done
function 函数
1 2 3 4 5 6 7 8 9 10 11
function isEmpty() { if [[ "$1" == "" || "$1" == "null" ]];then return 1 fi return 0 }
isEmpty '123' if [[ $? -eq 1 ]];then echo "isEmpty" fi
readonly、local
顾名思义,readonly 限制变量只读,local 限制变量生命周期在函数范围内。
1 2 3 4 5 6 7 8 9 10 11 12 13
#!/usr/bin/env bash set -o nounset set -o errexit
test() { readonly x=1 local y=2 echo $x echo $y } test echo $x echo $y # 这条语句会报错
echo 'Please enter your name' read name echo "My name is $name"
这里不能用单引号’包裹$name,否则会被解析为字符串
排序
如果输出只有一列:
1
sort test.txt
但是默认情况下是按照字典序排序的,如果数据本身是数字,则需要明确指明:
1
sort -n test.txt
按第 2 列排序:
1
sort -n -t ' ' -k 2 test.txt
去重
sort 命令也支持去重:
1
sort -u test.txt
uniq 命令专门用来去重,不过针对的是连续出现的相同记录:
1
sort test.txt | uniq
按行读取文件
写法 1:
1 2 3 4 5
#!/bin/bash while read line do echo $line done < filename(待读取的文件)
写法 2:
1 2 3 4 5
#!/bin/bash cat filename(待读取的文件) | while read line do echo $line done
写法 3:
1 2 3 4
for line in `cat filename(待读取的文件)` do echo $line done
for 读取和 while 读取是有区别的:
1 2 3 4 5 6 7 8 9 10 11 12
$ cat file 1 2 3
$ 使用 while 读取 1 2 3
$ 使用 for 读取 1 2 3
遍历一个目录下的所有文件
如果碰到文件夹则递归搜索,碰到文件则执行自定义操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
function read_dir() { for file in `ls $1`; do if [[ -d $1"/"${file} ]]; then read_dir $1"/"${file} elif [[ ${file} != *md ]]; then # 跳过不符合匹配条件的文件plainplainplainplainplainplainplainplainplainplain echo '忽略文件:'$1"/"${file} else # 处理该文件 echo $1"/"${file} fi done }
while read line do # 每一行格式为"a,b,c"plain if [[ $line =~ ^\"(.+)\",\"(.+)\",\"(.+)\"$ ]];then echo ${BASH_REMATCH[1]}-${BASH_REMATCH[2]}-${BASH_REMATCH[3]} else echo "Not match" fi done < data.txt