Logo 逆向知识库

bash

Bash 是最好的语言(确信)

基础语法#

算术上下文#

for ((i=0; i<5; i++)); do
    echo "$i"
done

 

变量魔法#

str="HelloWorld"
> echo ${str:2:4} # 变量切分,从 2 开始,切 4 个字符
lloW 
> echo ${#str} # 获取变量长度
10
echo ${str/[eo]/X} # 正则替换,只替换一次
HXlloWorld
> echo ${str//[eo]/X} # 双斜杠,替换所有
HXllXWXrld

user="${1:-nick}" # 假如 $1 是空的,就赋值为 nick

 

统计字数#

some work | wc -m # -m 是统计字符数,默认为字节数,可以 man 或者 -<TAB> 查看所有选项

 

脚本之间参数的传递#

#/usr/bin/bash
echo "\$@ (无括号)每个参数按照 IFS 拆分:"
for arg in $@; do echo "[$arg]"; done

echo
echo "\"\$@\" (有括号)每个参数作为独立元素传递:"
for arg in "$@"; do echo "[$arg]"; done

echo
echo "\$* (无括号)和 \$@ 一样:"
for arg in $*; do echo "[$arg]"; done

echo
echo "\"\$*\" (有括号)所有参数都当作一个整体:"
for arg in "$*"; do echo "[$arg]"; done

结果:

> ./1.sh "Hello World" --check
$@ (无括号)每个参数按照 IFS 拆分:
[Hello]
[World]
[--check]

"$@" (有括号)每个参数作为独立元素传递:
[Hello World]
[--check]

$* (无括号)和 $@ 一样:
[Hello]
[World]
[--check]

"$*" (有括号)所有参数都当作一个整体:
[Hello World --check]

 

信号处理#

trap '命令' 信号名

 

错误就退出#

set -e

管道错误就退出:

set -o pipefail

 

进程替代 >() <()#

>() 是输出到一个 fd 中,例如:

> echo hi | tee >(cat) >(cat) >/dev/null
hi
hi
> echo hi > >(cat) > >(cat)
hi
hi

 

数组(zsh 不可用)#

定义数组

my_array=("value1" "value2" "value3")

访问数组

echo ${my_array[0]}
echo ${my_array[@]} # 全部元素 
for ele in ${my_array[@]}; do echo $ele; done

while true; do
    out=()

    for module in "${modules[@]}"; do
        out+=("$("$module")")
    done

    IFS=' | '
    echo "${out[*]}"
    sleep 1
done

修改数组

my_array[1]="new_value"