我之前不需要编写任何 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
Run Code Online (Sandbox Code Playgroud)
不工作。如果 i=0 则打印出来。这是我的输入。
./品味 1 2 3 4 5 6 7 8 ABC
我期待 ABC 被打印出来。最后我必须制作ABC。
有人可以帮忙吗?
它应该比问题中的循环简单得多:
\n\nshift 8\necho "$*"\nRun Code Online (Sandbox Code Playgroud)\n\n丢失参数 1-8;将所有其他参数打印为单个字符串,并用单个空格分隔参数(并保留参数内的空格)。
\n\n或者,如果您需要在变量中使用它,那么:
\n\nnine_onwards="$*"\nRun Code Online (Sandbox Code Playgroud)\n\n或者,如果您无法丢弃主 shell 进程中的前 8 个参数:
\n\nnine_onwards="$(shift 8; echo "$*")"\nRun Code Online (Sandbox Code Playgroud)\n\n你可以检查是否至少有 9 个参数,当然,如果没有则抱怨。或者您可以接受空字符串而不是 \xe2\x80\x94 而不会出现错误。
\n\n如果参数必须无空格连接(如问题的修正案),那么你必须处理$IFS:
nine_onwards="$(shift 8; IFS=""; echo "$*")"\nRun Code Online (Sandbox Code Playgroud)\n\n如果我正确地解释了这个答案下面的注释,那么您希望将前 8 个参数保存在 8 个单独的简单(非数组)变量中,然后将参数 9 开始保存在另一个简单变量中,参数值之间没有空格。
\n\n这是非常可行的:
\n\nvar1="$1"\nvar2="$2"\nvar3="$3"\nvar4="$4"\nvar5="$5"\nvar6="$6"\nvar7="$7"\nvar8="$8"\nvar9="$(shift 8; IFS=""; echo "$*")"\nRun Code Online (Sandbox Code Playgroud)\n\n这些名称不必像它们那样密切相关。你可以使用:
\n\nteflon="$1"\nabsinthe="$2"\nastronomy="$3"\nlobster="$4"\ndarkest_peru="$5"\nmp="$6"\nculinary="$7"\ndogma="$8"\nconcatenation="$(shift 8; IFS=""; echo "$*")"\nRun Code Online (Sandbox Code Playgroud)\n\n您也不必按照该顺序执行它们;任何序列(排列)都会很好。
\n\n另请注意,在问题中,您有:
\n\narray="${@}"\nRun Code Online (Sandbox Code Playgroud)\n\n尽管有这个名称,但这会创建一个包含参数的简单变量。要创建数组,必须使用如下括号,其中空格是可选的:
\n\narray=( "$@" )\nRun Code Online (Sandbox Code Playgroud)\n