列表结构
与列表:
command-1 && command-2 && command-3 && command-4 一个命令返回真值(0)后再执行下一个命令, 返回假值立即退出
如: 输出输入的参数
if [ ! -z "$1" ] && echo "Argument #1 = $1" && [ ! -z "$2" ] && echo "Argument #2 = $2"
或列表:
command-1 || command-2 || command-3 || command-4 一个命令返回假值(非0)进行执行,返回真值(0)退出
如: ( false && true ) || echo false
函数
函数格式为:
function function_name()
{
command ~~~
}
注意:函数定义必须在第一次调用函数前完成.没有像 C 中的函数“声明”方法. 如:
#!/bin/bash #函数没有声明, 定义必须在使用之前 f1 declare -f f1 #声明是无效的 f1 f1() { echo "calling f2 from function1" f2 } f2() { } |
函数的输入参数与返回参数
function_name $arg1 $arg2
函数以位置来引用传递过来的参数(就好像他们是位置参数(positional parameters)), 例如$1, $2,以此类推
#!/bin/bash DEFAULT=default func2(){ if [ -z "$1" ] then echo "-parameter #1 is zero length."- else echo "-param #1 is "$1".-" fi variable=${1-$DEFAULT} echo "variable=$variable" return 0 } echo echo "Nothing passed." func2 echo echo "zero-length passed" func2 "" echo echo "null parameter passed" func2 "$unitinalize" echo echo "one param pass" func2 first echo |
传递间接引用给函数
采用${!variavle}的形式传递间接引用
#!/bin/bash echo_var() { echo "$1" } message=hello hello="how do you do" echo_var "${!message}" hello="hello again!" echo_var ${message} echo_var "${!message}" |
返回值
return可以有选择的带一个整形的返回值, 这个值可以返回给调用这个函数的脚本, 也就是给$?, 但是最大返回值是255.
如何返回字符串或者数组, 使用函数外部的一个可见变量:
#!/bin/bash count_lines(){ [ -r /etc/passwd ] && REPLY=$(echo $(wc -l < /etc/passwd)) } if count_lines then echo "there are $REPLY line" else echo "can not find" fi |
局部变量
local
函数输入的重定向
function_name(){
command;command
}<file
数组
说明 | 表示 |
---|---|
表示整个数组 | ${array[*]} or ${array[@]} |
数组中元素的个数 |
${#string[@]} or ${#string[*]} |
第一个元素的第一个字符输出 |
${array:1} |
输出第一个元素的长度 | ${#array[0]} or ${#array} |
数组声明与访问
//直接声明, 声明的数组可以不连接, 允许存在空值, 一部分成员允许不被初始化 array[12]=34 array[23]=45 array[34]="China" echo ${array[*]}//输出整个数组 echo ${array[0]}//输出空行 echo ${array[34]} //数组元素运算 array[1] = `expr ${array[12]} + ${array[23]}` echo -n ${array[1]} //通过括号声明数组 num=( 1 2 3 4 5 6 ) echo ${num[@]} //通过键值对声明数组 price=(["rice"]=12 ["apple"]=24) #不支持键值是非数字的 echo -n ${price[*]} //通过命令返回生成数组 array=`seq 1 10` //使用declare -a 声明数组 |
字符串操作用于数组操作
一般来说,任何类似 ${name ... } 写法的字符串操作符,都能在一个数组的所有字符串元素中使用 像${name[@] ... } 或 ${name[*] ...} 的写法 .
numb=(one two three four five five six seven eight) #提取尾部的字符串 echo ${numb[@]:0} # 输所有 echo ${numb[@]:2} # 输出第二个及以后元素 echo ${numb[@]:1:2} #第一个元素后面两个 #子串删除:从前部删除最短的子串, 匹配子串是一个正则表达式 # # ## % %% echo ${numb[@]#t*e} echo ${numb[@]##t*e} #子串替换 //str/repl /#str/repl /%str/repl /str/repl echo "-----------子串替换----------" echo -n "所有ive换成OOO:" echo ${numb[@]//ive/OOO} echo -n "第一个ive换成OOO:" echo ${numb[@]/ive/OOO} echo -n "替换最前部出现的fie换成ooo" echo ${numb[@]/#fi/OOO} echo -n "替换最后步出现的字符ee->OOO" echo ${numb[@]/%ee/OOO} |
终端输入字符串数组
#!/bin/bash declare -a colours read -a colours echo -n "输入的colours:" echo ${colours[@]} colour_num=${#colours[@]} index=0 echo $colour_num while [ "$index" -lt "$colour_num" ] do echo ${colours[$index]} ((index ++)) done |
数组复制与元素添加
#!/bin/bash number1=`seq 1 10` number2=("$number1[@]") echo -n '原有数组number1:' echo ${number1[*]} echo -n "复制后的数组number2:" echo ${number2[*]} numberAdd=("${number2[@]}" "add element") |
|