有没有一种简单的方法来反转数组?
#!/bin/bash
array=(1 2 3 4 5 6 7)
echo "${array[@]}"
Run Code Online (Sandbox Code Playgroud)
所以我会得到:7 6 5 4 3 2 1
而不是:1 2 3 4 5 6 7
VAR=a,b,c,d
# VAR=$(echo $VAR|tr -d '\n')
echo "[$VAR]"
readarray -td, ARR<<< "$VAR"
declare -p ARR
Run Code Online (Sandbox Code Playgroud)
结果:
[a,b,c,d]
declare -a ARR=([0]="a" [1]="b" [2]="c" [3]=$'d\n')
Run Code Online (Sandbox Code Playgroud)
我怎么能告诉readarray不要添加最后的换行符\n?最新的$符号是什么意思?
使用 bash 4.4.20(1) 运行以下脚本时失败
#!/bin/bash
bar() {
local args=("y")
}
foo() {
local -r args=("x")
bar
}
foo
Run Code Online (Sandbox Code Playgroud)
有错误,但使用 bash 4.2.46(2) 运行时成功,这在阅读24.2line 3: args: readonly variable后有意义。局部变量。
以下带有非数组变量的脚本运行时没有任何问题:
#!/bin/bash
bar() {
local args="y"
}
foo() {
local -r args="x"
bar
}
foo
Run Code Online (Sandbox Code Playgroud)
我找不到任何可以解释 bash 4.2.46(2) 和 bash 4.4.20(1) 之间差异的更改。
问:这是 bash 4.4.20(1) 中的错误吗?如果这是预期的行为那么为什么第二个脚本不会失败?
有没有办法*在 zsh 中查找数组(文件名)的长度,而不使用 for 循环来增加某些变量?
我天真地尝试过,echo ${#*[@]} 但没有成功。(也欢迎 bash 语法)
我有一段可以工作的代码,如下所示(请注意,这是用于 AWS 自动部署的 CloudFormation 模板):
EFS_SERVER_IPS_ARRAY=( $(aws efs describe-mount-targets --file-system-id ${SharedFileSystem} | jq '.MountTargets[].IpAddress' -r) )
echo "IPs in EFS_SERVER_IPS_ARRAY:"
for element in "${EFS_SERVER_IPS_ARRAY[@]}"
do
echo "$element"
echo "$element $MOUNT_SOURCE" >> /etc/hosts
done
Run Code Online (Sandbox Code Playgroud)
这有效,但看起来很难看。我想避免数组变量和for循环(基本上我不关心第一个 echo 命令)。
我可以以某种方式使用输出($element,它是 1 个或更多,目前是 2 行 IP)并将其汇集到两个执行中,例如:
long AWS command >> echo $element $MOUNT_SOURCE >> /etc/hosts
Run Code Online (Sandbox Code Playgroud)
在当前的实现中,echo 执行的次数与数组中的变量一样多?我将如何重写这个?
AWS 命令的输出是这样的:
10.10.10.10
10.22.22.22
Run Code Online (Sandbox Code Playgroud)
然后,添加的行/etc/hosts如下所示:
10.10.10.10 unique-id.efs.us-east-1.amazonaws.com
10.22.22.22 unique-id.efs.us-east-1.amazonaws.com
Run Code Online (Sandbox Code Playgroud) 以下后期解决方案按预期工作:
因此 - 从他的回答来看:
function copyFiles() {
arr=("$@")
for i in "${arr[@]}";
do
echo "$i"
done
}
array=("one 1" "two 2" "three 3")
copyFiles "${array[@]}"
Run Code Online (Sandbox Code Playgroud)
写这篇文章的原因是如果发生以下情况怎么办:
copyFiles "${array[@]}" "Something More"
copyFiles "Something More" "${array[@]}"
Run Code Online (Sandbox Code Playgroud)
问题:我确实意识到发送的参数,当收到它们时,函数中的参数如何 - 它们实际上是合并的 - 所以$1并且$2不再按预期工作,“数组”参数与其他参数集成
我已经做了一项研究:
遗憾的typeset -n是不起作用
并在:
无法按预期工作 - 在该答案中,有一条评论表明存在问题 - 带有演示测试/验证的链接 - 关于${#array[@]}函数内的数组大小 ( ) 不同。
那么如何实现这个目标呢?
在阅读fff的源代码以了解有关 Bash 编程的更多信息时,我看到一个超时选项read作为数组传递给这里:
read "${read_flags[@]}" -srn 1 && key "$REPLY"
Run Code Online (Sandbox Code Playgroud)
的值read_flags设置如下:
read_flags=(-t 0.05)
Run Code Online (Sandbox Code Playgroud)
(read因此,预期的调用是read -t 0.05 -srn 1)。
我不太明白为什么不能使用字符串,即:
read_flags="-t 0.05"
read "$read_flags" -srn 1 && key "$REPLY"
Run Code Online (Sandbox Code Playgroud)
这种基于字符串的方法会导致“无效的超时规范”。
经过调查,我想出了一个测试脚本parmtest:
show() {
for i in "$@"; do printf '[%s]' "$i"; done
printf '\n'
}
opt_string="-t 1"
opt_array=(-t 1)
echo 'Using string-based option...'
show string "$opt_string" x y z
read "$opt_string"
echo
echo 'Using array-based …Run Code Online (Sandbox Code Playgroud) 我有一个这样的数组:
array=(1 2 7 6)
Run Code Online (Sandbox Code Playgroud)
并想搜索第二大值,输出为
secondGreatest=6
Run Code Online (Sandbox Code Playgroud)
有没有办法在 bash 中做到这一点?
使用以下代码:
#! /bin/bash
declare -a arr=("element1"
"element2" "element3"
"element4" )
echo "1"
echo "${arr[@]}"
echo "2"
echo ${arr[*]}
Run Code Online (Sandbox Code Playgroud)
输出是:
1
element1 element2 element3 element4
2
element1 element2 element3 element4
Run Code Online (Sandbox Code Playgroud)
所以输出是一样的。
那么什么时候强制使用一种方法而不是另一种方法呢?
#!/usr/bin/bash\n\n\nARGENT=("Nous devons \xc3\xa9conomiser de l'argent."\n"Je dois \xc3\xa9conomiser de l'argent.")\n\nBIENETRE=("Comment vas-tu?" "Tout va bien ?")\n\naoarrs=("${ARGENT}" "${BIENETRE}")\n\nselect arr in "${aoarrs[@]}"; do\n for el in "${arr[@]}"; do\n echo "$el"\n done\n break\ndone \n\nRun Code Online (Sandbox Code Playgroud)\n我希望此脚本将数组名称打印给用户,ARGENT并且BIENETRE\n以便用户可以选择其中之一。用户输入后,脚本将打印所选数组的每个元素。我想从数组的数组 ( ) 中选择select一个数组来循环aoarrs。我想使用 select 的原因是因为在现实世界中,我的数组数组中可能不止两个数组。我怎样才能做到这一点?