这里主要是shell脚本中的常用命令片段
命令行中常用的代码片可以参考
linux常用命令的参考参考
常见特殊符号的解读可以参考
脚本相关
测试脚本
- shell测试脚本,只输出一行内容
折叠代码块BASH
复制代码
1
| bash <(curl -s https://pastebin.com/raw/ApyZL1jU)
|
脚本头
用于设置执行脚本的环境
全局配置
最好在每个脚本加上,用于防止编写大型脚本的时候出现错误
脚本传参的引用
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| echo $0
echo $#
echo $*
echo $@
echo $1
echo $?
result=$(echo "google " | grep -q "google" ; echo $?)
|
脚本输入参数
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
test="" while getopts ":t:" opt do case $opt in t) test=$OPTARG echo $test exit 0 ;; *) echo "wrong" exit 1 ;; esac done
shift $(($OPTIND - 1)) echo $1
|
参考1
参考2
脚本常用命令
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| read answer echo $answer
sleep 2
output() { local test=1 }
shift 1
printf "$test [hello]${test2}${test3}"
|
获取命令执行结果
折叠代码块BASH
复制代码
1 2 3 4 5 6
| result1=$(echo "a")
eval result2='`echo a`'
result3=`echo a`
|
不下载脚本运行
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8
|
curl http://test.com/install.sh | bash -s all
bash <(curl http://test.com/install.sh) -s key1 -m key2 datastr
|
脚本执行
bash 兼容 sh,所以 sh 可以用的命令 bash都可以用
基本上两个命令差不多
折叠代码块BASH
复制代码
1 2 3 4 5 6 7
| bash test.sh
bash <(curl -s https://pastebin.com/raw/ApyZL1jU)
bash -c "echo 'today is sunny'; date"
|
目录和文件相关
获取当前脚本所在目录
折叠代码块BASH
复制代码
1 2 3 4 5 6
| dir="$(dirname $0)" cd $dir
dir="$(pwd)" echo $dir
|
遍历某个目录下的文件进行操作
折叠代码块BASH
复制代码
1 2 3 4 5
| for i in ./*.mp4 do ls -al $i done
|
逐行处理文件
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| filePath="myfile.txt" params=($(cat $filePath | awk '{print $0}')) count=${#params[*]} for ((i=0;i<${count};i+=2)); do echo ${params[i]} echo ${params[i + 1]} echo ${params[i + 2]} done
cat myfile.txt | while read rows do echo $rows done
while read rows do echo $rows done < mycontent.txt
|
获取当前目录有几个.txt的文件
折叠代码块BASH
复制代码
1 2 3
|
ls -1 *.txt 2 > /dev/null | wc -l
|
网络相关
url编解码
折叠代码块BASH
复制代码
1 2 3 4 5 6 7
|
echo "你好" | tr -d '\n' | xxd -plain | sed 's/\(..\)/%\1/g' echo '手机' | tr -d '\n' | od -An -tx1| tr ' ' %
echo -n $url | sed 's/\\/\\\\/g;s/\(%\)\([0-9a-fA-F][0-9a-fA-F]\)/\\x\2/g' urldecode() { : "${*//+/ }"; echo -e "${_//%/\\x}"; }
|
参考
正则获取github release版本号
折叠代码块BASH
复制代码
1 2 3 4 5 6 7
|
latest=$(cat ./logs/latest | grep 'data-view-component="true" class="Link--primary">' -m 1 | sed -r 's:.*tag/(.*?)" data-view-component="true".*:\1:g')
latest=$(cat ./logs/latest | grep 'data-view-component="true" class="Link--primary">' -m 1 | grep -o -P '(?<=tag/).*?(?=")')
|
参考
获取ip
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| getip(){ ip=$(wget -qO- -t1 -T2 ipinfo.io/ip) if [[ -z "${ip}" ]]; then ip=$(wget -qO- -t1 -T2 api.ip.sb/ip) if [[ -z "${ip}" ]]; then ip=$(wget -qO- -t1 -T2 members.3322.org/dyndns/getip) if [[ -z "${ip}" ]]; then ip="IP" fi fi fi } getIPV4() { curl -s 'http://ipv4.lookup.test-ipv6.com/ip/?callback=&asn=1&testdomain=test-ipv6.com&testname=test_asn4' \ --compressed \ --insecure --connect-timeout 4 | jq -r ".ip" } getIPV6() { curl -s 'http://ipv6.lookup.test-ipv6.com/ip/?callback=&asn=1&testdomain=test-ipv6.com&testname=test_asn6' \ --compressed \ --insecure --connect-timeout 4 | jq -r ".ip" }
|
字符串相关
字符串显示有问题
- 将变量包在引号内,
"$result"
- curl中变量需要放在双引号内,单引号无法使用变量
去掉结尾换行符
折叠代码块BASH
复制代码
1 2 3 4 5 6
| echo -n "test\n"
echo "test" | tr -d '\n'
echo "test" | tr -d '\r'
|
特殊符号
$加不同括号的区别
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9
| test=1
echo "${test}"
echo $[$test+5]
echo "$(date)"
echo "`date`"
|
几种括号的区别
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
. test.sh
if [ "$i" -ne 1 ];then : else echo "$i is not equal 1" fi
(A=abc;echo $A);echo $A
{ A=abc;echo $A; };echo $A
[ "$i" -ne 1 ]
[[ (-d "$HOME") && (-w "$HOME") ]]
((i=1+99));echo $i
|
<的几种区别
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11
|
cat <<EOF This is a document EOF cat <<<"aaa" cat < <(echo "12345") bash <(curl -s https://www.mytest.com/s.sh)
|
标准输入输出
折叠代码块BASH
复制代码
1 2 3 4
| ip=$(curl ipinfo.io/ip -o -)
echo "hello" | base64 -
|
赋初值
折叠代码块BASH
复制代码
1 2 3 4
| result=1
result=${result:-3} echo $result
|
运算符
字符串比较
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13
| answer="n"
"$answer" = "y"
"$answer" != "y"
-z answer
-n answer
$answer =~ ^([01][0-9]|2[0-3]|[0-9]):([0-5][0-9]|[0-9])$
"$ngx_ver" != *"nginx version:"*
|
文件判断
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| -b file
-c file
-d file
-f file
-g file
-k file
-p file
-u file
-r file
-w file
-x file
-s file
-e file
|
数字比较
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| request=2
$request -eq 0 $request == 0
$request -ne 0 $request != 0
$request -gt 0
$request -lt 0
$request -ge 0
$request -le 0
|
数字计算
折叠代码块BASH
复制代码
1 2 3 4
| index=2 result=`expr $index + 1` result=$[$index+5]
|
布尔计算
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11
| !3 == 3
2 -eq 3 -o 2 -ne 2
2 -eq 3 -a 2 -ne 2
while (( "$#" ));do echo "hello $#" shift 1 done
|
数组
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| test=(hello world)
test=($(ls ./))
test[0]="value0"
${test[index]}
${test[@]}
${!test[*]}
${#test[*]}
domains=() for i in $@; do domains+=($i) done
echo $test | grep -w "key"
for line in ${result[*]} do ls -al $line done
|
函数
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| test() { echo $0 echo $# echo $* echo $@ echo $1 echo $? } test hello
|
流程控制
if
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11
| answer='n'
if [ "$answer" = "y" ];then echo "请输入gitea的ip地址" read answer elif [ "$answer" = "a" ];then echo "test" read answer else echo "wrong" fi
|
while
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13
| index=1 count=3 while (( $index < $count )) do cd ~/software index=`expr $index + 1` done
while true do command done
|
for
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| test=(he ll o)
for i in ${test[@]}; do echo $i done
domains=() for i in $@; do domains+=($i) done
NODE_NUM=5 for ((i=1;i<=${NODE_NUM};i++)); do echo "${NODE_NUM}" done
|
switch
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13
| num=1 case $num in 1) firstFunc secondFunc echo "hello" ;; 2) firstFunc echo "hello2" ;; 0|*) echo "感谢使用" break ;; esac
|
小工具
命令行的自动点击脚本
折叠代码块BASH
复制代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #!/bin/bash
if [[ "$(which xdotool)" = "" ]];then sudo apt-get install xdotool -y fi
for i in {1..1154} do xdotool mousemove 74 308 xdotool click 1 done
|
v1.5.2