1. linux中shell变量$#,$@,$0,$1,$2的含义解释:
变量说明:
$$
Shell本身的PID(ProcessID)
$!
Shell最后运行的后台Process的PID
$?
最后运行的命令的结束代码(返回值)
$-
使用Set命令设定的Flag一览
$*
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$@
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$#
添加到Shell的参数个数
$0
Shell本身的文件名
$1~$n
添加到Shell的各参数值。$1是第1参数、$2是第2参数…。
2. $(command) 也叫做命令替换
把一个命令或者函数的输出,赋值给一个变量
varname=$(ls)
$((expression))
把括号内的数学计算结果赋值给变量
result=$((start + last))
3. 在一个script中引入其他script
source scriptname 或者 . scriptname
4. Intepreter line:
在script的第一行,以#!开头
#!/bin/bash
5. 查看环境变量
env
6. 通过引号可以改变命令参数的位置
echo 'This is ' a test
$0: echo
$1: 'This is '
$2: a
$3: test
7. $* 和 $@的区别
他们都包含了通过命令行传进来的位置参数。如果没有引号,那么他们是相同的,都是把位置参数根据空格,分割成一个个字符串
$*包含了引号即"$*",把位置参数当做一个字符串
$@包含了引号即"$@" 通过空格把,位置参数当做数组
例子:./test.sh 'a b' c
#!/bin/bash
#shell name: test.sh
echo "The total number of paras is $#"
for arg in $*
do
echo "\$* args is: $arg"
done
#output:
#$* args is: a
#$* args is: b
#$* args is: c
for arg in $@
do
echo "\$@ arg is: $arg"
done
#output:
#$@ args is: a
#$@ args is: b
#$@ args is: c
for arg in "$*"
do
echo "\$* args is: $arg"
done
#output:
#$* args is: a b c
for arg in "$@"
do
echo "\$@ args is : $arg"
done
#output:
#$@ args is : a b
#$@ args is : c
8. set 和 shift
set命令,可以重新把参数的位置初始化
shift可以弹出第一个位置的参数,其他参数依次减一
9. 关于特殊字符" '和\
例子
myvar=testing
echo $myvar
testing
echo "$myvar"
testing
echo "'$myvar‘“
testing
echo \$myvar
$myvar
echo '$myvar'
$myvar
10. ls 和 each
ls
列出所有文件名,有格式
echo *
列出所有文件名,不过文件名之间有一个空格
同样适用于 ls file[0-2] 和 each file[0-2]
11. 使用{}去掉变量的二义性
比如 myvar=testing
echo ${myvar}_me
结果testing_me, 如果不加{},则显示空,因为$myvar_me没有定义
另外也适用${10}的位置变量
12. {}用于变量的赋值
${name:-word} 如果name赋值了,则显示name的值,否则显示word
${name:+word} 如果name赋值了,则显示word,否则显示空
${name:=word} 如果name赋值了,则显示name的值,否则把那么赋值为word,并且显示word
${name:?error message} 如果name没有赋值,则显示errormessage
${#name} 显示name的内容的长度。例如name=12345 则${#name}输出5
13. ~, ~-, ~+
~代表用户的主目录
~-上次的目录,比如你从 /bin -> /home/stony/, 则~-为/bin
~+回到当前目录,同上例子,~+为/home/stony
~username, 进入其他用户的家目录,/home/username
cd - 等同于 cd~-
14. 命令替换
使用反引号``,和使用$(),同样可以实现命令替换
例子
myvar=`ls -l'
myvar=$(ls -l)
15. 使用(())进行数学运算
可以在(())中,对变量进行赋值运算。
例如((x=3+5)), echo $x结果8。主要,(())中,变量不能加$符号
或者echo $((3+5)) 结果也是8.
16. 通过dc进行浮点数运算
result=$(dc -e '2.4 3.2+p')
结果5.6
17. read命令读取变量
read a b c d
如果输入多于4个,比如this is a test me,则最后的所有都赋值给变量d
如果少于4个,比如this is a,则没有赋值的变量为空
18.在shell中,控制流程的语句,比如if, while等等,0代表true,1代表false。表达式的返回值通过$?带回来,0代表true,1代表false。
19.位运算,只能通过(())形式得到结果,布尔运算也可以通过(())得到结果。
要注意,本身运算的结果(和我们的常识一致)和返回结果($?,和我们的常识相反)的区别
$((1&0))=0 $?=1
$((1&&0)=0 $?=1
$((1|0))=1 $?=0
$((1||0))=1 $?=0
20.
(expression) 返回表达式的值
!expression 表达式的值取反
expression1 && expression2 两个表达式都为true 则为true
expression1 || expression2 其中一个为true,则为true
((expre1 & expre2)) 按位与
((expre1 | expre2)) 按位或
((expre1 ^ expre2)) 按位异或
((expre1 && expre2)) 逻辑与
((expre1 || expre2)) 逻辑或
21. && 和 || 短路运算符
expresion1 && expression2 只有当expresion1为true的时候,也就是expresion1返回码为0的时候,才执行expresion2。换句话说,要想执行expresion2,必须expresion1得通过才行。
expresion1 || expression2 只有当expresion1为false的时候,也就是expresion1返回码不为为0的时候,才执行expresion2。换句话说,要想执行expresion2,必须expresion1执行失败才可以。
22.if语句
if
then
elif
then
else
fi
23. 判断语句的4种类型,也就是跟在if后面的判断语句的类型
1)test
2)[]和test一致
3)[[]]
4)(())算数运算,也可以用于逻辑预算
注意用[[]]时候,判断字符串相等[[ $user == fred ]]
用[]时候,判断字符串相等[ $user = fred ]
24.空语句
:或者 pass
例如 if false
then
:
else
echo "hello"
fi
25. String的比较
[ -z arg ] 如果arg长度为0,则为true
[ -n arg ] 如果arg长度不为0,则为true
[ arg ] 如果arg长度不为0,则为true
[[ arg1 == arg2 ]]
[[ arg1 != arg2 ]]
[[ arg1 < arg2 ]]
[[ arg2 > arg2 ]]
26. 算术运算比较 []和[[]]作用相同
[[ arg1 -eq arg2 ]] 等于 (( arg1 = arg2 )) 等于 [ arg1 -eq arg2 ]
[[ arg1 -ne arg2 ]] 不等 (( arg1 != arg2 )) 等于 [ arg1 -ne arg2 ]
[[ arg1 -it arg2 ]] 小于 (( arg1 < arg2 )) 等于 [ arg1 -it arg2 ]
[[ arg1 -le arg2 ]] 小于等于 (( arg1 <= arg2 )) 等于 [ arg1 -le arg2 ]
[[ arg1 -ge arg2 ]] 大于等于 (( arg1 >= arg2 )) 等于 [ arg1 -ge arg2 ]
27.对文件的判断
常用的
-d file 如果文件存在并且为目录
-e file 如果文件存在
-f file 如果文件存在,并且是一个常规文件
-r file 如果文件存在,并且文件可读
-w file 如果文件存在,并且文件可写
-x file 如果文件存在,并且文件可以执行
28. 循环for,while, until
必须都有do和done
29. for循环
for var in a b c 在指定的数组里循环
for var 不加任何东西,指的是取位置参数
30. case 结构
case
a) aaa;
b) bbb;
*) ccc;
esac
例子
read reply
>hi
case $reply in
hello) echo "hello" ;;
hi) echo "hi" ;;
*) ehco "else";;
esac
31. select语句和case语句结合使用
select var in yes no cancel
do
case $var in
yes)...
...
esac
done
32. echo -n 指的是不要起一个新行,在原来这一行就可以。
33.大括号扩展 brace expansion
image.{gif,png,jpg} 等同于image.gif,image.png,image.jpg
34. ${}除了除去变量二义性,默认变量赋值之外,还可以模式匹配去掉字符
${variable#pattern}从变量值前面匹配最小,并且去掉
例子file=image.png
echo ${file#*.}
png
${variable##pattern}从变量值前面匹配最大,并且去掉
例子var=lot.of.word.by.comma
echo ${var##*.}
comma
${variable%pattern}从变量值后面匹配最小,并且去掉
例子file=image.png
echo ${file%.*}
image
${variable%%pattern}从变量值后面匹配最大,并且去掉
例子var=lot.of.word.by.comma
echo ${var%%.*}
lot
35.${}替换
${var/pattern/string} 替换一个
例如
var=StringWithLotsAndLots
echo ${var/Lots/Many}
StringWithManyAndLots
${var//pattern/string} 全部替换
例如
var=StringWithLotsAndLots
echo ${var//Lots/Many}
StringWithManyAndMany
${*/pattern/string}或者${@/pattern/string}
将位置参数中的pattern全部替换为string
36.${} 截取字符串
${variable:offset}
${varible:offset:length}
例如:
var=this is a very long string variable
echo ${var:5}
is a very long string variable
echo ${var:-5}
iable
echo ${var:5:8}
is a ver
37. ${} 显示变量的名字${!pattern*}, 注意,显示的是变量的名字,不是变量的值
mystring="this is a string"
mynumber=10
myphone="1111"
echo ${!my*}
mystring mynumber myphone
38.数组变量
可以通过typeset -a arrayname设置数组变量
通过$arrayname[subscript]取值
${#arrayname[*]}显示数组中元素的个数
39.typeset
typeset -r var 设置只读变量
typeset -x var 设置可执行变量
通过+关闭属性,例如typeset +r var
typeset, declare, local都是声明局部变量
40.getopts命令
while getopts "i:o:vc" opts
do
case $opts in
(i) input_filename=$OPTARG;;
(o) ouput_filename=$OPTARG;;
(v) verbose=true;;
(c) count=true;;
(*) echo "else";;
esac
done
41. 如果read命令没有指定变量,则$REPLY变量将存储输入的值
例如
read
>this is my test
echo $REPLY
this is my test
----------------------------------------------------------
read -a vars
将读入参数变成数组存入vars变量中
例如
read -a vars
>this is my testing
echo ${vars[1]}
is
----------------------------------------------------------
read-p "Username> "
提示用户
----------------------------------------------------------
read -s pwd
输入密码,不显示
----------------------------------------------------------
read -t timeout
设置超时时间
----------------------------------------------------------
read -n number
设置接受的输入字符个数
42. trap命令
通常的格式: trap command [a list of signals]
例如 trap {echo "Interapted"; break} 2 3
如果用一个空命令,则信号将被忽略
例如 trap '' 1 2 3
如果trap后面没有任何命令,则将命令复原
例如 trap 1 2 3
INT,用户Ctrl+C中断,将按照默认执行
往往配合使用:
trap '' 1 2 3
do something import
trap 1 2 3
43.错误重定向
>&2