我以前不需要编写任何bash脚本。这是我需要做的。
我的脚本将使用一组字符串参数运行。刺痛次数将超过8次。我将不得不连接字符串9和以后的字符串,并从中生成一个字符串。像这样。。。
myscript s1 s2 s3 s4 s5 s6 s7 s8 s9 s10….(完全未知)
在脚本中,我需要这样做。。。
新字符串=s9+s10+。。。
我正在尝试这样的东西。。。(来自网络搜索)。
array="${@}"
tLen=${#array[@]}
# use for loop to read string beyond 9
for (( i=8; i<${tLen}; i++ ));
do
echo ${array[$i]} --> just to show string beyond 9
done
不起作用。如果i=0,它就会打印出来。这是我的意见。
/最美味的1 2 3 4 5 6 7 8 A B C
我正等着印刷A B C。最后我将不得不制作ABC。
有人能帮忙吗?
它应该比问题中的循环简单得多:
shift 8
echo "$*"
失败的论点1-8;将所有其他参数打印为单个字符串,并使用单个空格分隔参数(保留参数中的空格)。
或者,如果你需要它在一个变量中,那么:
nine_onwards="$*"
或者,如果您不能丢弃主shell进程中的前8个参数:
nine_onwards="$(shift 8; echo "$*")"
当然,你可以检查一下是否至少有9个论点,如果没有,你可以抱怨。或者,您可以接受一个空字符串,而不会出现任何错误。
如果论点必须连在一起,没有空格(就像问题的修正案中一样),那么你就必须处理$IFS
:
nine_onwards="$(shift 8; IFS=""; echo "$*")"
如果我正确解释了这个答案下面的注释,那么你想把前8个参数保存在8个单独的简单(非数组)变量中,然后把参数9保存在另一个简单变量中,参数值之间没有空格。
这是非常可行的:
var1="$1"
var2="$2"
var3="$3"
var4="$4"
var5="$5"
var6="$6"
var7="$7"
var8="$8"
var9="$(shift 8; IFS=""; echo "$*")"
这些名字不必像它们那样密切相关。您可以使用:
teflon="$1"
absinthe="$2"
astronomy="$3"
lobster="$4"
darkest_peru="$5"
mp="$6"
culinary="$7"
dogma="$8"
concatenation="$(shift 8; IFS=""; echo "$*")"
你也不必按照这个顺序来做;任何序列(排列)都会做得很好。
也要注意,在这个问题中,你有:
array="${@}"
不管名称如何,它都会创建一个包含参数的简单变量。要创建一个数组,必须使用这样的括号,其中的空格是可选的:
array=( "$@" )
# Create a 0-index-based copy of the array of input arguments.
# (You could, however, work with the 1-based pseudo array $@ directly.)
array=( "${@}" )
# Print a concatenation of all input arguments starting with the 9th
# (starting at 0-based index 8), which are passed *individually* to
# `printf`, due to use of `@` to reference the array [slice]
# `%s` as the `printf` format then joins the elements with no separator
# (and no trailing n).
printf '%s' "${array[@]:8}"
# Alternative: Print the elements separated with a space:
# Note that using `*` instead of `@` causes the array [slice] to be expanded
# to a *single* string using the first char. in `$IFS` as the separator,
# which is a space by default; here you could add a trailing n by using
# '%sn' as the `printf` format string.
printf '%s' "${array[*]:8}"
请注意,array="${@}"
不创建数组,它只是创建一个字符串标量,该标量包括输入数组元素的级联(总是),每个元素由空间分隔;若要创建数组,必须将其包含在(...)
中。
要根据您在后续问题中的要求,从以双引号括起来的第9个开始的参数创建一个空格分隔的单个字符串,请使用以下命令:
printf -v var10 '"%s"' "${array[*]:8}"
对于问题中的最后一个示例调用,$var10
将包含文字"A B C"
,包括双引号。
至于将参数1到8分配给各个变量
Jonathan Leffler的有用答案展示了如何将前8个自变量保存在单个变量中。
以下是一种基于给定名称前缀和序列号创建单个变量的算法替代方案:
n=8 # how many arguments to assign to individual variables
# Create n 'var<i>' variables capturing the first n arguments.
i=0 # variable sequence number
for val in "${array[@]:0:n}"; do
declare "var$((++i))=$val" # create $var<i>, starting with index 1
done
# Print the variables created and their values, using variable indirection.
printf "nvar<i> variables:n"
for varName in "${!var@}"; do
printf '%sn' "$varName=${!varName}"
done
你很接近-这样的东西会起作用:
array=( ${*} )
# use for loop to read string beyond 9
for (( i=8; i<${#array[*]}; i++ ));
do
echo -n ${array[$i]}
done