#declare and initialize array in bash
declare -a arr=(aa bb cc)
myarr=(a b c)
myarr1=([0]=a [1]=b [2]=c)
myarr2[0]=a
myarr2[1]=b
myarr2[2]=c
#get length of array
echo ${#array[@]}
#note : get length of the ith element of array
echo ${#array[1]}
#enumerate elements in array
for i in ${array[@]};do
echo $i
done
#但最好用引号,这样元素里面的空格就会被保留下来
for i in "${array[@]}" ;
#可以把数组保存在文件里,内容就是数组的定义和初始化,然后source它
a.txt: array=(a b c)
bash: source a.txt ; echo ${array[@]}
#还可以这样,data.txt放的内容是a b c,然后bash: thisArr=(`cat data.txt`)
for idx in ${!array[@]};do
echo $idx ':' ${array[idx]}
done
#清除数组
unset myarr
#复制数组
newArr=("${array[@]}")
#连接两个数组
all_together=("${arr1[@]}" "${arr2[@]}")
#增加元素
array=("${array[@]" yyy)
#数组截取,new就是新数组,要记得括号,否则得到的是空格分割的字符串
new=(${array[@]:start:len})
#bash本身不支持二位数组,但可以这样
a=('a b c' 'd e' 'f g h')
for i in "${a[@]}";do
b=("$i")
for j in "${b[@]}";do
echo $j
done
done
#顺序读取标准输入到数组
declare -a array
n=4
i=0
while [[ "$i" -le "$n" ]];do
echo "input elements"
read array[$i]
i=`expr $i + 1`
done
#查看数组,有带下标哦
set |grep myarr
#i.g : read -a 读入数组: read -a myletter ---> 输入 aa bb cc
tail -5 /etc/shells > shells.txt
read -a myshells < shells.txt
set |grep myshells
#添加比如path这样的环境变量 prepend PATH /tmp/test : PATH=
prepend() {
[[ -d $2 ]] && eval $1=\"$2':'$$1\" && export $1
}
##这个更好,如果PATH为空的话
prepend() { [ -d "$2" ] && eval $1=\"$2\$\{$1:+':'\$$1\}\" && export $1 ; }
#数值计算,一下3中只支持整数计算
let [[]] ()
let a=b+c
let a++
let a+=10
echo $[a-b]
echo $[$a-11]
echo $((a-b))
#expr是命令,所以计算的过程要记得有空格
result=`expr $a + 111`
result=$(expr $b \* 11) # 记得*是wild card有跳脱符
#bc可以计算浮点数
result=`echo 'scale=3; 13/8' | bc `
#进制换算
a=5
echo "obase=2; $a" |bc
b=101101
echo "obase=10;ibase=2 ; $b" |bc # obase要在ibase之前,否则无效
#文件描述符
exec 3<data.txt
cat <&3
#错误示范,因为stderr导入stdin,而stdin此时正是屏幕输出等于没用( &>all.log)
ls no_exists_files.txt data.txt 2>&1 >log.txt
ls no_exists_files.txt data.txt >log.txt 2>&1
##bash从4.0开始支持关联数组,坑爹的是macos12.04居然是3.2的bash
declare -A myarr
myarr=([name]=royaso [age]=33)
echo ${myarr[name]}
#获取关联数组的索引
echo ${!myarr[@]}
#光标
tput cols
tput lines
tput longname
tput cup 10 1 ( 10 row 1col)
#输入不回显
echo "input passwd"
stty -echo
read passwd
stty echo
echo "your password is $passwd"
#count down times
echo -n "Count:"
tput sc ##save cursor position
count=0
while true;do
if [[ $count -le 5 ]] ;then
let count++;
sleep 1
tput rc #恢复原来的光标位置
tput ed # delete thereafter ---ig: $count 删除下面的数字
echo -n $count #输出count后会在Count:后面一位所以上面ed删除掉
else
exit 0;
fi
done
#bash -x 调试模式,在脚本里用set
#debug.txt
for i in {1..6};do
set -x
echo $i
set +x
done
echo "task over"
#:冒号不做什么,: asdfsadfsdf 所以当注释用也可以
###使用方法------ _DEBUG=on bash debug2.sh
#debug2.txt
DEBUG(){
[[ "$_DEBUG" == "on" ]] && $@ || : # 如果设置了环境变量_DEBUG为on,就执行后面语句否则不执行
}
for i in {1..5};do
DEBUG echo $i
done
echo "task is over"
####!/bin/bash改成 #!/bin/bash -xv
#把自定义的函数导出到子shell,即导出函数为环境变量 export -f fname
#read的参数 -s -p -n -d -t
#重复执行执行某条命令直到成功 true命令可以换成内置命令:加快执行速度
repeae(){
while true;do
$@ && return
sleep 10
done
}
#IFS
data='aa,bb,cc'
oldIFS=$IFS
IFS=,
for i in "$data";do
echo $i
done
IFS=$oldIFS
#c风格的for
for((i=0;i<10;i++)){
echo $i
}
#until ; 输出1..10
x=0
untile [[ $x -eq 10 ]];do
let x++;
echo $x
done
##[ $var1 -ne 0 -a $var2 -gt 2 ] #使用逻辑与-a [ $var1 -ne 0 -o var2 -gt 2 ] #逻辑或 -o
#find . \( -name aaa -o -name "my*" \)
#find /home/users -path "*/slynux/*" -print
find . \( -path './test' -o -path './test2' \) -a -prune -o -name '*.txt' -print
#tr rot13加解密 vim:g?
cat a.txt |tr "[a-zA-Z]" "[n-za-mN-ZA-M"
#sum ----: seq 10 >num.txt
cat num.txt | echo $[ $(tr '\n' '+' ) 0 ]
#expect
spawn ./a.sh
expect "num:"
send "555\n"
expect "name:"
send "royaso\n"
expect eof
#数组添加元素
array+=(aa)
#并行执行
pid_arr=()
for i in a.txt b.txt; do
md5sum $i & #后台执行
pid_arr+=("$!") # 得到最近执行的pid
done
wait ${pid_arr[@]} #等待执行完毕
echo "over
seq 10 | head -n -4 #打印除了最后4行
#只列出目录
ls -d */
find . -maxdepth 1 -type d -print
seq 10 | awk 'BEGIN{print "sum below"; sum=0} {print $1"+"; sum+=$1} END{ print "result is " sum}'
echo | awk '{print v1,v2}' v1=sdf v2=ijji