前段时间我写了一个 bash 脚本,现在应该能够在ash.
在bash它是这样的:
services=( "service1.service"
"service2.service"
"service3.service" )
for service in "${services[@]}"
do
START $service
done
START()
{
echo "Starting "$1
systemctl start $1
}
Run Code Online (Sandbox Code Playgroud)
实际上,阵列中大约有 40 个服务,我想让这种转换尽可能轻松和干净。一直在使用bashisms。现在,我正忙于使脚本更具可移植性的任务。
出于可移植性的原因,拥有一个纯粹的ash解决方案可能会很好。但是由于我有一个非常强大的功能busybox,我可能会牺牲一些便携性。只有在可读性大大提高的情况下,因为“干净”的脚本也是一个指标。
在这种情况下,什么是便携式和干净的解决方案?
一个简单脚本的帮助
#!/bin/bash
array1=(
prova1
prova2
slack64
)
a="slack64"
b="ab"
if [ $a = $b ]
then
echo "$a = $b : a is equal to b"
else
echo "$a = $b: a is not equal to b"
fi
Run Code Online (Sandbox Code Playgroud)
这个脚本根本不起作用,我想要一个脚本来检查列表中是否存在 slack64(我使用数组),然后简单地给我,是存在或否。我不知道如何将数组与单个变量进行比较。
我正在尝试创建一个脚本,它将启动许多后台命令。对于每个后台命令,我都需要获取返回码。
我一直在尝试以下脚本:
#!/bin/bash
set -x
pid=()
return=()
for i in 1 2
do
echo start $i
ssh mysql "/root/test$i.sh" &
pid[$i]=$!
done
for i in ${#pid[@]}
do
echo ${pid[$i]}
wait ${pid[$i]}
return[$i]=$?
if [ ${return[$i]} -ne 0 ]
then
echo mail error
fi
done
echo ${return[1]}
echo ${return[2]}
Run Code Online (Sandbox Code Playgroud)
我的问题是在等待循环期间,如果第二个 pid 在第一个之前完成,我将无法获得返回码。
我知道我可以运行wait pid1 pid2,但是使用此命令我无法获取所有命令的返回码。
任何的想法 ?
我有两个这样的数组:
A=(vol-175a3b54 vol-382c477b vol-8c027acf vol-93d6fed0 vol-71600106 vol-79f7970e vol-e3d6a894 vol-d9d6a8ae vol-8dbbc2fa vol-98c2bbef vol-ae7ed9e3 vol-5540e618 vol-9e3bbed3 vol-993bbed4 vol-a83bbee5 vol-ff52deb2)
B=(vol-175a3b54 vol-e38d0c94 vol-2a19386a vol-b846c5cf vol-98c2bbef vol-7320102b vol-8f6226cc vol-27991850 vol-71600106 vol-615e1222)
Run Code Online (Sandbox Code Playgroud)
数组未排序,甚至可能包含重复元素。
我想使这两个数组相交并将元素存储在另一个数组中。我该怎么做?
另外,如何获取出现在 B 中但在 A 中不可用的元素列表?
我需要从一个字符串到一个数组,其中每个条目都是该字符串上的每个单词。例如,从以下开始:
VotePedro="Vote for Pedro"
Run Code Online (Sandbox Code Playgroud)
我需要数组:
Vote
For
Pedro
Run Code Online (Sandbox Code Playgroud)
然后我应该能够迭代为:
for i in "${votePedroArray[@]}"
do
## Do something
done
Run Code Online (Sandbox Code Playgroud) 1 #!/bin/bash
2 # query2.sh
3
4 numbers=(53 8 12 9 784 69 8 7 1)
5 i=4
6
7 echo ${numbers[@]} # <--- this echoes "53 8 12 9 784 69 8 7 1" to stdout.
8 echo ${numbers[i]} # <--- this echoes "784" to stdout.
9
10 unset numbers[i]
11
12 echo ${numbers[@]} # <--- this echoes "53 8 12 9 69 8 7 1" to stdout.
13 echo ${numbers[i]} # <--- stdout is blank.
Run Code Online (Sandbox Code Playgroud)
Why, in line …
以下数组表示每台 linux 机器上的磁盘数量
每个单个阵列都包含linux 机器上的磁盘数量。
echo ${ARRAY_DISK_Quantity[*]}
4 4 4 4 2 4 4 4
Run Code Online (Sandbox Code Playgroud)
识别所有数组的值都相等的简单方法是什么?
良好状态:
4 4 4 4 4 4 4 4
Run Code Online (Sandbox Code Playgroud)
状态不佳:
4 4 4 4 4 4 2 4
Run Code Online (Sandbox Code Playgroud)
状态不佳:
6 6 6 6 6 6 6 6 6 6 2 6 2
Run Code Online (Sandbox Code Playgroud) 如何将数组作为变量从第一个 bash shell 脚本传递到第二个脚本。
第一个.sh#!/bin/bash
AR=('foo' 'bar' 'baz' 'bat')
sh second.sh "$AR" # foo
sh second.sh "${AR[@]}" # foo
Run Code Online (Sandbox Code Playgroud)
第二个.sh
#!/bin/bash
ARR=$1
echo ${ARR[@]}
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,结果都是foo。但我想要的结果是foo bar baz bat.
我做错了什么,我该如何解决?
我们要构建 6 个挂载点文件夹作为示例
/data/sdb
/data/sdc
/data/sdd
/data/sde
/data/sdf
/data/sdg
Run Code Online (Sandbox Code Playgroud)
所以我们使用数组编写了这个简单的 bash 脚本
folder_mount_point_list="sdb sdc sdd sde sdf sdg"
folderArray=( $folder_mount_point_list )
counter=0
for i in disk1 disk2 disk3 disk4 disk4 disk5 disk6
do
folder_name=${folderArray[counter]}
mkdir /data/$folder_name
let counter=$counter+1
done
Run Code Online (Sandbox Code Playgroud)
现在我们想改变没有counter的代码并且let=$counter=counter+1
是否可以移动每个循环数组以获得下一个数组值?
就像
${folderArray[++]}
Run Code Online (Sandbox Code Playgroud) 在下面的代码,当我给选项r则getopts需要一个参数:
while getopts ":hr::l:" opt; do
case $opt in
r ) echo "Run Numbers - argument = $OPTARG " ;;
l ) echo "Latency range - argument = $OPTARG" ;;
h ) helptext
graceful_exit ;;
* ) usage
clean_up
exit 1
esac
done
Run Code Online (Sandbox Code Playgroud)
但是我需要在-r选项之后传递两个参数,而不是一个。是否有捷径可寻?