命令行技巧心得
Moevis
今天在看一些有关 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