将字符附加到除最后一个bash数组之外的每个元素

时间:2016-08-18 04:23:46

标签: arrays bash loops

我希望附加一个bash数组的每个元素index.js,除了最后一个。

var container = CloudKit.getDefaultContainer();
var database = container.publicCloudDatabase; // We'll only make calls to the public database.

// Sign in using the keyID and public key file.
container.setUpAuth().then(function (userInfo) {
    println("userInfo", userInfo);
    return database.performQuery({ recordType: 'Test' });
}).then(function (response) {
    println("Queried Records", response.records);
}).catch(function (error) {
    console.warn(error);
});

我想要的输出是

|

我做了什么

array=("element1" "element2" "element3")

其次是

array=("element1"|"element2"|"element3")

我是否可以使用任何其他循环方法,只将该字符附加到最后一个但只有一个元素?

4 个答案:

答案 0 :(得分:2)

您可以使用:

# append | all except last element
read -ra array < <( printf "%s|" "${array[@]:0:$((${#array[@]} - 1))}"; echo "${array[@]: -1}"; )

# Check array content now
declare -p array
declare -a array='([0]="element1|element2|element3")'
  • "${array[@]:0:$((${#array[@]} - 1))}"将获得除数组
  • 的最后一个元素之外的所有元素
  • "${array[@]: -1}"将获取数组的最后一个元素
  • printf "%s|"会在所有参数
  • 前附加|
  • < <(...)是进程替换以从stdin
  • 读取任何命令的输出
  • read -ra将读取数组中的输入

答案 1 :(得分:2)

对于您的特殊情况,每个阵列成员之间只需要插入一个字符,最简单的解决方案可能是使用数组扩展(并更改分隔根据您的需要事先预测角色IFS

$ array=("element1" "element2" "element3")
$ array=( $( IFS="|" ; echo "${array[*]}") )
$ echo "\$array[0] is '${array[0]}'"
$array[0] is 'element1|element2|element3'

答案 2 :(得分:1)

$ array=("element1" "element2" "element3")
$ printf -v str "|%s" "${array[@]}"
$ array=("${str:1}")
$ declare -p array
declare -a array='([0]="element1|element2|element3")'

printf语句创建一个包含str的字符串|element1|element2|element3,即比我们想要的更多|(在开头)。

下一个语句使用子字符串参数扩展${str:1}来跳过第一个字符并重新分配给array,现在它由一个元素组成。

答案 3 :(得分:1)

一个简单的解决方案(如果你不介意改变IFS)是:

$ array=("element1" "element2" "element3")
$ IFS="|"; printf "%s\n" "${array[*]}"

重新分配给变量数组(不改变IFS):

$ array=("$(IFS="|"; printf "%s\n" "${array[*]}")")
$ printf '%s\n' "${array[@]}"
element1|element2|element3

另一种解决方案是:

$ array=($(printf '%s|' "${array[@]}")); array="${array%?}"
$ printf '%s\n' "${array}"

更复杂的解决方案(脚本)是:

array=("element1" "element2" "element3")

       delimiter='|'
       unset newarr
for    val in "${array[@]}"
do     newarr=$newarr${newarr+"$delimiter"}$val
done

array=("$newarr")

echo "array=($array)"