一、Shell 数组(转载)
原文路径:shell 数组
数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。
与大部分编程语言类似,数组元素的下标由0开始。
Shell 数组用括号来表示,元素用”空格”符号分割开,语法格式如下:
array_name=(value1 value2 … valuen)
例如:my_array=(A B “C” D)
我们也可以使用下标来定义数组:
array_name[0]=value0
array_name[1]=value1
array_name[2]=value2
读取数组
读取数组元素值的一般格式是:
${array_name[index]}
my_array=(A B "C" D)
echo "第一个元素为: ${my_array[0]}"
echo "第二个元素为: ${my_array[1]}"
echo "第三个元素为: ${my_array[2]}"
echo "第四个元素为: ${my_array[3]}"
执行脚本,输出结果如下所示:
第一个元素为: A
第二个元素为: B
第三个元素为: C
第四个元素为: D
获取数组中的所有元素
使用@ 或 * 可以获取数组中的所有元素,例如:
my_array=(A B "C" D)
echo "数组的元素为: ${my_array[*]}"
echo "数组的元素为: ${my_array[@]}"
执行脚本,输出结果如下所示:
数组的元素为: A B C D
数组的元素为: A B C D
获取数组的长度
获取数组长度的方法与获取字符串长度的方法相同,例如:
my_array=(A B "C" D)
echo "数组元素个数为: ${#my_array[*]}"
echo "数组元素个数为: ${#my_array[@]}"
行脚本,输出结果如下所示:
数组元素个数为: 4
数组元素个数为: 4
二、Shell 的循环
Linux shell 的循环,大体和C语言的循环差不多,只是格式上有一些差异。以下以C语言和 Linux shell 循环做一个对比:
一般的,C 语言的 循环大体如下:
for (int i = 0; i < n; i++) {
printf("i=%d\n", i);
}
while (i < n) {
printf("i=%d\n", i);
i++;
}
而 Linux shell 的循环格式中,多了一个 do ---- done 的结构,其他的和C语言没什么差别了。其实也蛮好理解 do — done 结果的,顾名思义,就是 开始做—做完了
for i in {1..10}
do
echo $i
done
i=0
while [ $i -lt 10 ]
do
echo $i
let i++
done
三、shell 中的几个特殊变量(转载)
linux bash Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
在linux下配置shell参数说明
前面已经讲到,变量名只能包含数字、字母和下划线,因为某些包含其他字符的变量有特殊含义,这样的变量被称为特殊变量。
例如,$ 表示当前Shell进程的ID,即pid,看下面的代码:
$echo $$
运行结果
29949
特殊变量列表
变量
含义
$0
当前脚本的文件名
$n
传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$#
传递给脚本或函数的参数个数。
$*
传递给脚本或函数的所有参数。
$@
传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$?
上个命令的退出状态,或函数的返回值。
$$
当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
命令行参数
运行脚本时传递给脚本的参数称为命令行参数。命令行参数用 $n 表示,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。
请看下面的脚本:
#!/bin/bash
echo “File Name: $0”
echo “First Parameter : $1”
echo “First Parameter : $2”
echo “Quoted Values: $@”
echo “Quoted Values: $*”
echo “Total Number of Parameters : $#”
运行结果:
$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2
$* 和 $@ 的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" “)包含时,都以”$1" “
n” 的形式输出所有参数。
但是当它们被双引号(" “)包含时,”$" 会将所有的参数作为一个整体,以"$1 $2 …
@" 会将各个参数分开,以"$1" “
n” 的形式输出所有参数。
下面的例子可以清楚的看到 $ 和 $@ 的区别:
#!/bin/bash
echo “$=" $
echo “”$"=" "$”
echo “$@=” $@
echo “”$@"=" “$@”
echo “print each param from $"
for var in
var"
done
echo “print each param from $@”
for var in
var"
done
echo "print each param from "$”"
for var in “
var”
done
echo “print each param from “$@””
for var in “
var”
done
执行 ./test.sh “a” “b” “c” “d”,看到下面的结果:
“= a b c d
@”= a b c d
print each param from $
a
b
c
d
print each param from
*"
a b c d
print each param from “$@”
a
b
c
d
退出状态
$? 可以获取上一个命令的退出状态。所谓退出状态,就是上一个命令执行后的返回结果。
退出状态是一个数字,一般情况下,大部分命令执行成功会返回 0,失败返回 1。
不过,也有一些命令返回其他值,表示不同类型的错误。
下面例子中,命令成功执行:
$./test.sh Zara Ali
File Name : ./test.sh
First Parameter : Zara
Second Parameter : Ali
Quoted Values: Zara Ali
Quoted Values: Zara Ali
Total Number of Parameters : 2
$echo $?
0
$
$? 也可以表示函数的返回值,后续将会讲解
四、一个脚本
#!/bin/sh
gpio_num1=(911 915 919 920 925 931 935 1022 912)
gpio_num2=(914 916 927 921 926 932 947 1023)
if [ "$1" = "gpio_test" ]
then
gpio_test_file="/persist/gpio_test.ini"
if [ -f "$gpio_test_file" ]
then
echo -n "" > "$gpio_test_file"
fi
for num1 in ${gpio_num1[@]}
do
echo $num1 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio$num1/direction
echo 1 > /sys/class/gpio/gpio$num1/value
done
for num2 in ${gpio_num2[@]}
do
echo $num2 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio$num2/direction
done
for out_dirval in ${gpio_num1[@]}
do
echo gpio$out_dirval
out_pull_dirction=`cat /sys/class/gpio/gpio$((out_dirval))/direction`
echo $out_pull_dirction
out_pull_state=`cat /sys/class/gpio/gpio$((out_dirval))/value`
echo $out_pull_state
if [[ $out_pull_dirction == out ]] && [[ $out_pull_state -eq 1 ]]
then
echo "gpio$out_dirval:11" >> /persist/gpio_test.ini
else
echo "gpio$out_dirval:12" >> /persist/gpio_test.ini
fi
done
for in_dirval in ${gpio_num2[@]}
do
echo gpio$in_dirval
in_pull_dirction=`cat /sys/class/gpio/gpio$((in_dirval))/direction`
echo $in_pull_dirction
in_pull_state=`cat /sys/class/gpio/gpio$((in_dirval))/value`
echo $in_pull_state
if [[ $in_pull_dirction == in ]] && [[ $in_pull_state -eq 1 ]]
then
echo "gpio$in_dirval:11" >> /persist/gpio_test.ini
else
echo "gpio$in_dirval:12" >> /persist/gpio_test.ini
fi
done
for number1 in ${gpio_num1[@]}
do
echo $number1 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio$number1/direction
echo 0 > /sys/class/gpio/gpio$number1/value
done
for number2 in ${gpio_num2[@]}
do
echo $number2 > /sys/class/gpio/export
echo in > /sys/class/gpio/gpio$number2/direction
done
for out_direcval in ${gpio_num1[@]}
do
echo gpio$out_direcval
out_down_dirction=`cat /sys/class/gpio/gpio$((out_direcval))/direction`
echo $out_down_dirction
out_down_state=`cat /sys/class/gpio/gpio$((out_direcval))/value`
echo $out_down_state
if [[ $out_down_dirction == out ]] && [[ $out_down_state -eq 0 ]]
then
echo "gpio$out_direcval:01" >> /persist/gpio_test.ini
else
echo "gpio$out_direcval:02" >> /persist/gpio_test.ini
fi
done
for in_direcval in ${gpio_num2[@]}
do
echo gpio$in_direcval
in_down_dirction=`cat /sys/class/gpio/gpio$((in_direcval))/direction`
echo $in_down_dirction
in_down_state=`cat /sys/class/gpio/gpio$((in_direcval))/value`
echo $in_down_state
if [[ $in_down_dirction == in ]] && [[ $in_down_state -eq 0 ]]
then
echo "gpio$in_direcval:01" >> /persist/gpio_test.ini
else
echo "gpio$in_direcval:02" >> /persist/gpio_test.ini
fi
done
cd /sys/kernel/debug/regulator/pm8909_l8
echo 1 > enable
state=`cat /sys/bus/spmi/devices/qpnp-vadc-4/mpp4_vreg_l8_2p9`
cat /sys/bus/spmi/devices/qpnp-vadc-4/mpp4_vreg_l8_2p9
if [[ $state -gt 1600000 ]] || [[ $state -lt 1300000 ]]
then
echo "mpp4:2" >> /persist/gpio_test.ini
else
echo "mpp4:1" >> /persist/gpio_test.ini
fi
echo 0 > enable
fi