Linux shell 数组 && 循环笔记

一、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" “ 2 &quot; &quot; 2&quot; … &quot; n” 的形式输出所有参数。
但是当它们被双引号(" “)包含时,”$" 会将所有的参数作为一个整体,以"$1 $2 … n &quot; &quot; n&quot;的形式输出所有参数;&quot; @" 会将各个参数分开,以"$1" “ 2 &quot; &quot; 2&quot; … &quot; n” 的形式输出所有参数。
下面的例子可以清楚的看到 $
和 $@ 的区别:
#!/bin/bash
echo “$=" $
echo “”$"=" "$
echo “$@=” $@
echo “”$@"=" “$@”
echo “print each param from $"
for var in d o e c h o &quot; * do echo &quot; var"
done
echo “print each param from $@”
for var in @ d o e c h o &quot; @ do echo &quot; var"
done
echo "print each param from "$
”"
for var in “ &quot; d o e c h o &quot; *&quot; do echo &quot; var”
done
echo “print each param from “$@””
for var in “ @ &quot; d o e c h o &quot; @&quot; do echo &quot; var”
done
执行 ./test.sh “a” “b” “c” “d”,看到下面的结果:

= a b c d &quot; *= a b c d &quot; “= a b c d
@ = a b c d &quot; @= a b c d &quot; @”= a b c d
print each param from $

a
b
c
d
print each param from @ a b c d p r i n t e a c h p a r a m f r o m &quot; @ a b c d print each param from &quot; *"
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

猜你喜欢

转载自blog.csdn.net/q1075355798/article/details/84659527