转载须知:个人博客随意,记得署名.商用及大中型网站联系我先sodya#qq.com,否则小心"上榜"


加精博文?

#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


There are no comments on this post.