自己在工作中用到的shell知识总结:
1. 变量
声明:
declare -ar ARRAYNAME
declare -r STRING="I think this gay must be crazy !"
-a 数组
-r 只读
$n $1 表示第一个参数,$2 表示第二个参数 ...
$# 命令行参数的个数
$0 当前程序的名称
$? 前一个命令或函数的返回码
$* 以"参数1 参数2 ... " 形式保存所有参数
$@ 以"参数1" "参数2" ... 形式保存所有参数
$$ 本程序的(进程ID号)PID
$! 上一个命令的PID
2. 数组
declare -a ARRAYNAME
ARRAY=(value1 value2 ... valueN) //数组赋值,各成员之间用 “空格” 分隔
如果没有定义索引号,默认是从0开始
i=5
ARRAYNAME[0]="bitch" //数组 赋值
ARRAYNAME["$i"]="son" //数组 赋值
$ARRAYNAME[0] //第一个元素的值
count="${#ARRAYNAME[@]}" //获取数据成员的个数 //数组的长度
count="${#ARRAYNAME[*]}" //获取数据成员的个数 //数组的长度
${#ARRAYNAME[3]} //第四个元素的长度
${ARRAYNAME[@]} //数组的全部元素
unset ARRAYNAME //删除数组变量,实际上是将ARRAYNAME的值赋空值
使用循环读出数组中的内容:
print_arr(){
count= "${#array[@]}" //数组的长度
i=0
while [ i -lt $count ]
do
tmp="$array["$i"]"
echo "$tmp"
let i++ //i 加1,确保退出循环的条件
}
3. 逐行读取文件中并去除每行中需求的部分,并且放在数组中
方法一:
readfile(){
#$1参数是传入的file的路径
file=$1
count=0
while read line
do
#分析每行,获取有用的部分,awk使用separator作为分隔符,将字符串
#分隔成几部分,这里我们获取第二部分,注意:引号的使用,单引号,
#双引号
tmp=`echo "$line" | awk -F'separator' '{print $2}'`
#消除两边的空格
tmp=`echo "$tmp" | sed -e 's/^ *//' -e 's/ *$//'`
if [ "$tmp" != "" ]
then
ARR["$count"]="$tmp"
let count++
fi
done < "$file"
#读取$file 中的内容
}
方法二:
cat "file" | while read line
do
echo $line
done
4. case 嵌套(相当重要的分号,嵌套时不要忘了)
例子:
case "$char" in
a)
case "$num" in
1|2|3|4|5) ##另一种写法,很好 :wink:
echo "$num"
;;
0)
echo "error"
;;
esac ##不要忘记了
;; ## 相当重要的分号,嵌套时不要忘了 :cry:
b)
case "$string" in
ni|wo|ta)
echo "do something"
;;
other)
echo "do something"
;;
esac ##不要忘记了
;; ##不要忘记了
*)
echo “do something ”
;;[color=blue][/color]
esac
5.格式化输出,很笨的方法
format_print (){
printf %7s "$1"
printf %8s "$2"
printf %-s " "
printf %-s "$3"
echo ""
}
数字代表 所占用的宽度,s表示字符(还有其他的自己找资料),,默认是右对齐,“-”表示右对齐,不足用空格表示,printf命令是不换行的,手工添加换行
6.函数
##定义
f(){
name=$1 //传参数
age=$2
echo“do something ”
}
##调用
f “leo” 23 ##参数之间用空格隔开
7.其他
调用外部命令获取其返回值
value=`pwd`
value=$(pwd)
string=$(cat file)
文件开头第一行
#!/bin/sh
1. 变量
声明:
declare -ar ARRAYNAME
declare -r STRING="I think this gay must be crazy !"
-a 数组
-r 只读
$n $1 表示第一个参数,$2 表示第二个参数 ...
$# 命令行参数的个数
$0 当前程序的名称
$? 前一个命令或函数的返回码
$* 以"参数1 参数2 ... " 形式保存所有参数
$@ 以"参数1" "参数2" ... 形式保存所有参数
$$ 本程序的(进程ID号)PID
$! 上一个命令的PID
2. 数组
declare -a ARRAYNAME
ARRAY=(value1 value2 ... valueN) //数组赋值,各成员之间用 “空格” 分隔
如果没有定义索引号,默认是从0开始
i=5
ARRAYNAME[0]="bitch" //数组 赋值
ARRAYNAME["$i"]="son" //数组 赋值
$ARRAYNAME[0] //第一个元素的值
count="${#ARRAYNAME[@]}" //获取数据成员的个数 //数组的长度
count="${#ARRAYNAME[*]}" //获取数据成员的个数 //数组的长度
${#ARRAYNAME[3]} //第四个元素的长度
${ARRAYNAME[@]} //数组的全部元素
unset ARRAYNAME //删除数组变量,实际上是将ARRAYNAME的值赋空值
使用循环读出数组中的内容:
print_arr(){
count= "${#array[@]}" //数组的长度
i=0
while [ i -lt $count ]
do
tmp="$array["$i"]"
echo "$tmp"
let i++ //i 加1,确保退出循环的条件
}
3. 逐行读取文件中并去除每行中需求的部分,并且放在数组中
方法一:
readfile(){
#$1参数是传入的file的路径
file=$1
count=0
while read line
do
#分析每行,获取有用的部分,awk使用separator作为分隔符,将字符串
#分隔成几部分,这里我们获取第二部分,注意:引号的使用,单引号,
#双引号
tmp=`echo "$line" | awk -F'separator' '{print $2}'`
#消除两边的空格
tmp=`echo "$tmp" | sed -e 's/^ *//' -e 's/ *$//'`
if [ "$tmp" != "" ]
then
ARR["$count"]="$tmp"
let count++
fi
done < "$file"
#读取$file 中的内容
}
方法二:
cat "file" | while read line
do
echo $line
done
4. case 嵌套(相当重要的分号,嵌套时不要忘了)
例子:
case "$char" in
a)
case "$num" in
1|2|3|4|5) ##另一种写法,很好 :wink:
echo "$num"
;;
0)
echo "error"
;;
esac ##不要忘记了
;; ## 相当重要的分号,嵌套时不要忘了 :cry:
b)
case "$string" in
ni|wo|ta)
echo "do something"
;;
other)
echo "do something"
;;
esac ##不要忘记了
;; ##不要忘记了
*)
echo “do something ”
;;[color=blue][/color]
esac
5.格式化输出,很笨的方法
format_print (){
printf %7s "$1"
printf %8s "$2"
printf %-s " "
printf %-s "$3"
echo ""
}
数字代表 所占用的宽度,s表示字符(还有其他的自己找资料),,默认是右对齐,“-”表示右对齐,不足用空格表示,printf命令是不换行的,手工添加换行
6.函数
##定义
f(){
name=$1 //传参数
age=$2
echo“do something ”
}
##调用
f “leo” 23 ##参数之间用空格隔开
7.其他
调用外部命令获取其返回值
value=`pwd`
value=$(pwd)
string=$(cat file)
文件开头第一行
#!/bin/sh