脚本,将所有$ input保存到1个变量中

时间:2014-12-05 13:44:35

标签: bash variables

示例:

bash script.sh "hello world"

(在脚本echo "$1"中)

hello world

问题:

bash script.sh "good" "morning" "everybody"

我需要在脚本中编写什么才能直接输出:

goodmorningeverybody

所以,一般情况下,我希望将$1$2$3,...(可以是100但我不知道)保存在一个变量中例如VAR1

4 个答案:

答案 0 :(得分:5)

您可以使用$*$@来引用所有位置参数。

来自3.4.2 Special Parameters

  

*

     

从一个开始扩展到位置参数。当扩展发生在双引号内时,它会扩展为单个单词,每个参数的值由IFS特殊变量的第一个字符分隔。也就是说," $ *"相当于" $ 1c $ 2c ...",其中c是IFS变量值的第一个字符。如果未设置IFS,则参数由空格分隔。如果IFS为null,则连接参数时不会插入分隔符。

     

@

     

从一个开始扩展到位置参数。当扩展发生在双引号内时,每个参数都会扩展为单独的单词。也就是说," $ @"相当于" $ 1" " $ 2#34; ...。如果双引号扩展发生在一个单词中,则第一个参数的扩展与原始单词的开头部分连接,最后一个参数的扩展与原始单词的最后一部分连接。当没有位置参数时," $ @"并且$ @扩展为空(即,它们被删除)。

因此,要将good morning everybody作为输出,您可以使用echo "$*"echo "$@"

一般来说,@对两个变量更有用。

然而,如果你真的希望所有的世界都按照你指明的方式一起放松,那么你有几个选择。

最简单的循环是:

for word; do
    s+=$word
done

for没有in <list>部分对位置参数进行操作。)

但是,您也可以通过控制*来使用IFS执行此操作。

所以你也可以做s=$(IFS=; echo "$*")。您希望/需要子shell以避免为当前shell设置IFS

答案 1 :(得分:3)

尝试这样做:

#!/bin/sh

var=$(printf '%s' "$@")
echo "$var"

甚至更好,归功于chepner

printf -v var '%s' "$@"

#!/bin/bash

for arg; do
    str+="$arg"
done

echo "$str"

输出:

goodmorningeverybody

注意:

"$@"将每个位置参数扩展为自己的参数:“$ 1”“$ 2”“$ 3”......

答案 2 :(得分:1)

你可以用循环来做到这一点:

for x in "$@"; do
  input="$input$x"
done

答案 3 :(得分:1)

您可以通过以下方式使用Shell-Parameter-Expansion执行此操作:

#!/bin/bash
VAR="$*"
VAR=${VAR// /}
echo $VAR

实施例

$ script.sh "good" "morning" "everybody"
goodmorningeverybody