变量
赋值
变量定义的过程中不能出现空格
your_name="runoob.com"
# 将/etc目录下的文件循环出来
for file in `ls /etc`
for file in $(ls /etc)
只读变量
使用readonly 命令能将变量定义为只读变量,只读变量的值不能被改变
myUrl="http://www.google.com"
readonly myUrl
删除变量
使用unset可以删除变量,unset 命令不能删除只读变量。
unset variable_name
变量类型
shell字符串
shell中的字符串可以用单引号,可以用双引号,也可以不用引号
单引号中不能存在变量,双引号中可以存在变量也可以出现转义字符
your_name="runoob"
# 使用双引号拼接
greeting="hello, "$your_name" !"
greeting_1="hello, ${your_name} !"
echo $greeting $greeting_1
# 使用单引号拼接
greeting_2='hello, '$your_name' !'
greeting_3='hello, ${your_name} !'
echo $greeting_2 $greeting_3
# 不用引号拼接
greeting_4=hello,$your_name
echo $greeting_4
输出结果为
hello, runoob ! hello, runoob !
hello, runoob ! hello, ${your_name} !
hello,runoob !
获取字符串的长度,提取子字符串
string=abcd
echo ${#string}
string="runoob is a great site"
echo ${string:1:4} # 注意4是子字符串的长度
查找子字符串
查找i或者o的位置,哪个先出现就计算哪个
string="runoob is a great site"
echo `expr index "$string" io` # 输出 4
数组
在shell中,用括号表示数组,数组元素用空格分开
数组名=(值1 值2 ... 值n)
还可以单独定义数组的各个分量:
array_name[0]=value0
array_name[1]=value1
array_name[n]=valuen
注释
单行注释用#,多行注释用
:<<!
注释内容...
注释内容...
注释内容...
!
传递参数
‘$# ’参数的个数
‘$*’ 和 ‘$@’ 引用所有传递的参数
shell中的中括号可用作一些条件的测试:
1)比较一个变量是否为0 [ $ var -eq 0 ]
- 文件或者目录是否存在 [ -e var ]
- 字符串比较 [ var2 ]
在进行字符串比较时,最好使用双中括号 [[ ]], 因为单中括号可能会导致一些错误,因此最好避开它们。
shell 基本编程
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
# 两个数相加
echo `expr 2 + 2`
echo
echo相当于print标准输出,例如echo hello
开启转义字符
echo -e " hello \n"
显示命令执行效果
echo `ls`
echo `date`
read 命令一个一个词组地接收输入的参数,每个词组需要使用空格进行分隔;如果输入的词组个数大于需要的参数个数,则多出的词组将被作为整体为最后一个参数接收。
测试文件 test.sh 代码如下:
read firstStr secondStr
echo "第一个参数:$firstStr; 第二个参数:$secondStr"
$ sh test.sh
一 二 三 四
第一个参数:一; 第二个参数:二 三 四
实例, 文件 test.sh:
read -p "请输入一段文字:" -n 6 -t 5 -s password
echo -e "\npassword is $password"
参数说明:
-p 输入提示文字
-n 输入字符长度限制(达到6位,自动结束)
-t 输入限时
-s 隐藏输入内容
$ sh test.sh
请输入一段文字:
password is asdfgh
printf(类似于c中的printf)
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf "%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf "%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数。
test
下面两个式子是相等的。
result=$[a + b]
result=`expr $a + $b`
if test $a = $b
if [ $a = $b ]
if语句
if condition
then
command1
command2
...
commandN
fi
for语句
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
while语句
while condition
do
command
done
break和continue的区别:continue只跳出当前循环,break会跳出所有的循环
函数
函数定义
[ function ] funname [()]
{
action;
[return int;]
}
[]内的为可选
函数返回值在调用该函数后通过 $? 来获得
向函数传递参数
funWithParam(){
echo "第一个参数为 $1 !"
echo "第二个参数为 $2 !"
echo "第十个参数为 $10 !"
echo "第十个参数为 ${10} !"
echo "第十一个参数为 ${11} !"
echo "参数总数有 $# 个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73
注意,{10}。当n>=10时,需要使用${n}来获取参数。
shell 输入输出重定向
1.n >& m 将输出文件 m 和 n 合并。2>&1
2.n <&m 将输入文件 m 和 n 合并。
需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
用>会覆盖原文件,用>>会追加原文件
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
引入外部包
. filename # 注意点号(.)和文件名中间有一空格
或
source filename