连接 bash 中前 N 个参数之外的剩余参数

Tas*_*Tas 3 string bash loops

我之前不需要编写任何 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。

有人可以帮忙吗?

Jon*_*ler 8

它应该比问题中的循环简单得多:

\n\n
shift 8\necho "$*"\n
Run Code Online (Sandbox Code Playgroud)\n\n

丢失参数 1-8;将所有其他参数打印为单个字符串,并用单个空格分隔参数(并保留参数内的空格)。

\n\n

或者,如果您需要在变量中使用它,那么:

\n\n
nine_onwards="$*"\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,如果您无法丢弃主 shell 进程中的前 8 个参数:

\n\n
nine_onwards="$(shift 8; echo "$*")"\n
Run Code Online (Sandbox Code Playgroud)\n\n

你可以检查是否至少有 9 个参数,当然,如果没有则抱怨。或者您可以接受空字符串而不是 \xe2\x80\x94 而不会出现错误。

\n\n

如果参数必须无空格连接(如问题的修正案),那么你必须处理$IFS

\n\n
nine_onwards="$(shift 8; IFS=""; echo "$*")"\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n\n

如果我正确地解释了这个答案下面的注释,那么您希望将前 8 个参数保存在 8 个单独的简单(非数组)变量中,然后将参数 9 开始保存在另一个简单变量中,参数值之间没有空格。

\n\n

这是非常可行的:

\n\n
var1="$1"\nvar2="$2"\nvar3="$3"\nvar4="$4"\nvar5="$5"\nvar6="$6"\nvar7="$7"\nvar8="$8"\nvar9="$(shift 8; IFS=""; echo "$*")"\n
Run Code Online (Sandbox Code Playgroud)\n\n

这些名称不必像它们那样密切相关。你可以使用:

\n\n
teflon="$1"\nabsinthe="$2"\nastronomy="$3"\nlobster="$4"\ndarkest_peru="$5"\nmp="$6"\nculinary="$7"\ndogma="$8"\nconcatenation="$(shift 8; IFS=""; echo "$*")"\n
Run Code Online (Sandbox Code Playgroud)\n\n

您也不必按照该顺序执行它们;任何序列(排列)都会很好。

\n\n

另请注意,在问题中,您有:

\n\n
array="${@}"\n
Run Code Online (Sandbox Code Playgroud)\n\n

尽管有这个名称,但这会创建一个包含参数的简单变量。要创建数组,必须使用如下括号,其中空格是可选的:

\n\n
array=( "$@" )\n
Run Code Online (Sandbox Code Playgroud)\n

  • 请(再次)更新您的问题以表明您真正想要什么。没有什么比试图回答“这不是我真正想问的问题”更令人沮丧的了。你说“变量”。正如您的问题所暗示的那样,您的意思是数组吗?赋值 `array="$@"` 并不像你想象的那样;它需要是 `array=( "$@" )` 其中这些空格是可选的。 (3认同)