简单的BASH命令收集
记录
利用/dev/urandom文件创建随机字符
tr -dc '=_+/A-Za-z0-9' </dev/urandom | head -c 100
随机数的生成
echo $RANDOM
会生成0-32767之间的整数随机数
shuf -i 123-456789 -n3
会生成三个123-456789之间的整数随机数
urlencode转换
function urlencode() {
local length="${#1}"
for (( i = 0; i < length; i++ )); do
local c="${1:i:1}"
case $c in
[a-zA-Z0-9.~_-])
printf "$c"
;;
*)
printf "$c" | xxd -p -c1 | while read x; do printf "%%%s" "$x"; done
esac
done
}
数组A对数组B和数组C的差集
A=(1 2 3 4 5 6 7 8 9)
B=(1 2)
C=(8 9 10)
ABC=($(echo ${B[*]} ${B[*]} ${C[*]} ${C[*]} ${A[*]}))
X=($(echo ${ABC[*]} | tr ' ' '\n' | sort | uniq -u | tr '\n' ' '))
echo ${X[*]}
注释内容
单行注释
# echo 1 (行首使用'#')
echo2
多行注释
- 使用':'号配合追加输入重定向,冒号在Bash里也是一个命令,表示啥都不做,<<是输入重定向,两个EOF(可用其它特殊成对字符替代)之间的内容通过<<追加给冒号
:<<EOF
echo "1"
echo "2"
EOF
echo 3
- 其它方法
cat >/dev/null <<EOF
echo "1"
echo "2"
EOF
echo "3"
[ 0 -eq 1 ] && {
echo "1"
echo "2"
}
echo "3"
最大公约数
#!/bin/bash
# Usage: 求正整数a,b的最大公约数
# https://www.youtube.com/watch?v=WGO4Tqx5owg
#
a=104
b=40
#
m=$(echo $a $b | tr ' ' '\n' | sort -n | tail -n1)
n=$(echo $a $b | tr ' ' '\n' | sort -n | head -n1)
until [ $n -eq 0 ]; do
y=$((m/n))
n=$((m%n))
m=$(((m-n)/y))
done
echo $a=$((a/m))*$m
echo $b=$((b/m))*$m
echo 最大公约数是$m
给小学生出题
#!/bin/bash
function jianfa() {
a=$(shuf -i 1-9 -n1) && b=$(shuf -i 1-9 -n1)
m=$(echo $a $b | tr ' ' '\n' | sort -n | tail -n1)
n=$(echo $a $b | tr ' ' '\n' | sort -n | head -n1)
suansi[i]="$m-$n="
ans[i]=$((m-n))
}
function JIAFA() {
m=$(shuf -i 1-9 -n1)
n=$(($(($RANDOM%$((10-m))))+1))
suansi[i]="$m+$n="
ans[i]=$((m+n))
}
function main() {
read -p "这次想挑战多少题目:" num </dev/tty
for ((i=0; i<num; i++)); do
pick=$(shuf -i 1-2 -n1)
[[ $pick == 1 ]] && jianfa || JIAFA
echo ${suansi[i]}
read -p "以上题目的答案是:" inputans </dev/tty
[[ $inputans == ${ans[i]} ]] && echo 答对了,继续加油哟 || i=$((i-1))
done
echo "挑战成功,太棒了!这次已经答对了$i道题目了,休息一下吧!"
}
main
#TODO
#自定义加减法范围
#错误率过高则挑战失败
#错题回顾