【问题标题】:How do I pass an array of strings to a Bash script and join that array?如何将字符串数组传递给 Bash 脚本并加入该数组?
【发布时间】:2018-04-26 01:13:09
【问题描述】:

我想在字符串"%2C+" 上加入一个字符串数组。我的 shell 脚本 launch 看起来像这样。

#!/bin/bash

function join_by { local d=$1; shift; echo -n "$1"; shift; printf "%s" "${@/#/$d}"; }

selectQuery=$(join_by "%2C+" $1)
echo selectQuery

但是当我运行./download-data $("state_code" "county_code") 时,我在终端中收到此错误:bash: state_code: command not found

我需要将参数作为数组传递,因为我计划稍后传递更多数组。类似./download-data $("state_code" "county_code") $("more" "string")

【问题讨论】:

  • bash 中没有数组字面量之类的东西; x=(a b) 是赋值语句的一种特殊形式。 $(...) 是一个命令替换。
  • shell 中也没有数组值。具有数组属性集的名称允许模拟传统数组的某些方面的语法,但任何扩展仍然只产生一个或多个不同的单词,而不是包含所有数组元素的一等值。
  • @Username :由于数组不是 bash 中的“一等公民”,因此您不能将它们传递给 bash 函数。您可以将保存数组的变量的 name 传递给函数,然后使用例如eval,但这很难看。对我来说,这就是我考虑用更适合您的应用程序的编程语言替换 bash 的地方。

标签: bash shell


【解决方案1】:

让你的脚本在不同的参数中接受多个字符串:

#!/bin/bash

function join_by { local d=$1; shift; echo -n "$1"; shift; printf "%s" "${@/#/$d}"; }

selectQuery=$(join_by "%2C+" "$@")
echo "$selectQuery"

然后使用多个参数运行它:

./download-data "state_code" "county_code"

【讨论】:

  • 对不起,我要澄清一下:我需要传递一个数组,因为我打算在将来修改这个脚本时传递多个数组。
  • 你不能:参数总是一个字符串列表。点赞findparallel 等并指定某个单词作为分隔符。然后运行例如./download-data array1 array1 -- array2 array2。或者,喜欢 gcc 并运行 ./download-data "array1 array1" "array2 array2" 并自己拆分字符串
  • 或者给出每个数组的长度,后跟它的元素。你会像 ./download-data "${#array1[@]}" "${array1[@]}" "${#array2[@]}" "${array2[@]}" 一样运行它,如果 array1 有两个元素,array2 有四个元素,它就像运行 ./download-data 2 array1elem0 array1elem1 4 array2elem0 array2elem1 array2elem2 array2elem3
  • @Username 可能,但是您需要如何更改它取决于您实际尝试执行的操作。多个数组与单个数组有什么不同?
  • @Username 但是你会用它们做什么呢?如果您只是要将它们附加在一起,那么一个结束和下一个开始并不重要。如果您正在做其他事情......这将取决于其他事情是什么。
猜你喜欢
  • 2013-06-18
  • 2015-12-19
  • 2016-09-15
  • 1970-01-01
  • 2022-12-09
  • 2016-08-16
  • 2016-10-25
  • 2016-06-14
  • 1970-01-01
相关资源
最近更新 更多