相关疑难解决方法(0)

使用空格扩展 bash 变量作为脚本中 bash 函数的参数

并不重要 - 但我正在尝试更深入地了解 bash 脚本,这让我发疯!

我的目标 - 在 bash 脚本中:

  • 定义一个接受参数的函数
  • 使用函数名称和参数设置 bash 变量 (CMD)
  • 通过$CMD执行

如果 $args 中没有空格,没问题 - 但这里有一个最小的脚本来说明:

#!/bin/bash
function tstArgs () {
    echo "In tstArgs: ArgCnt:$#; Arg1:[$1]; Arg2:[$2]"
}
ARG1=today
ARG2=tomorrow
CMD1="tstArgs $ARG1 $ARG2"
$CMD1 #Output - As Desired: In tstArgs: ArgCnt:2; Arg1:[today]; Arg2:[tomorrow]

ARGWS1="'today with spaces'"
ARGWS2="'tomorrow with spaces'"
CMD2="tstArgs $ARGWS1 $ARGWS2"
$CMD2 #Output: In tstArgs: ArgCnt:6; Arg1:[today]; Arg2:[with]

#The dream:
ARGARR=($ARGWS1 $ARGWS2)
CMD3="tstArgs ${ARGARR[@]}"
$CMD3 #Output: In tstArgs: ArgCnt:6; Arg1:[today]; Arg2:[with]
#ETC, ETC, ETC... …
Run Code Online (Sandbox Code Playgroud)

parameters bash shell parameter-expansion

3
推荐指数
1
解决办法
359
查看次数

如何使用 shell 变量作为curl命令的标题

我正在尝试将多个标头存储在 1 个 $HEADER shell 变量中,并将其与 CURL 一起使用。

HEADERS="-H \"X-API-KEY: $API_KEY\" -H \"Content-Type: application/json\""
URL="https://myendpoint"

curl -v $HEADERS -X GET  $URL
Run Code Online (Sandbox Code Playgroud)

我尝试了不同的组合,例如使用“$HEADERS”而不是 $HEADERS,但它不起作用

shell curl

2
推荐指数
1
解决办法
1801
查看次数

将可变数量的参数传递给命令

我正在使用FPM来创建Debian软件包,我遇到了一个小问题.我的bash脚本需要5个参数.

TARGET=$1
VERSION=$2
DESCRIPTION=$3
DEPENDENCIES=$4
REVISION=$5
Run Code Online (Sandbox Code Playgroud)

麻烦的是4美元,我把它传给下面的字符串

-d"apt-transport-https> 0.8.16~exp12ubuntu10.15"-d"mongodb> 1:2.0.4-1ubuntu2"-d"ntp> 1:4.2.6.p3 + dfsg-1ubuntu3.1"

双引号在我的字符串中转义,所以当我echo $DEPENDENCIES,引号正确显示.

FPM使用-d标志可以多次使用,我需要能够将脚本中的参数列表传递给fpm.

我想做的事情如下:

fpm ...blah blah details... $DEPENDENCIES path
Run Code Online (Sandbox Code Playgroud)

$ DEPENDENCIES应该将多个标志传递给fpm,但它似乎只能识别第一个.如果我手动编写参数,它工作正常,但尝试使用字符串传递参数不起作用.

我不确定是什么.救命?

bash

1
推荐指数
1
解决办法
2133
查看次数

构造需要引号的命令参数

我有一个Bash脚本需要调用一个命令,该命令需要其中一个参数的引号.当我运行命令

myTimeCommand --time="2018 04 23 1100" -o /tmp/myOutput ~/myInput
Run Code Online (Sandbox Code Playgroud)

从命令行,它工作正常.在我的脚本中,我想传递"2018 04 23 1100"作为参数并将其直接发送到命令.

myScript --time="2018 04 23 1100"
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试这个时,我收到一条错误消息

""2018" is not a valid time.
Run Code Online (Sandbox Code Playgroud)

我正在使用getopt解析参数.这是我的剧本

OPTIONS=t:
LONGOPTIONS=time:

PARSED=$(getopt --options=$OPTIONS --longoptions=$LONGOPTIONS --name "$0" -- "$@")
echo ${PARSED}

# read getopt’s output this way to handle the quoting right:
eval set -- "$PARSED"

# now enjoy the options in order and nicely split until we see --
while true; do
    echo "option: ${1}"
    case "$1" in
        -t|--time)
            timeBase="$2"
            timeBase="--time=\"${timeBase}\"" …
Run Code Online (Sandbox Code Playgroud)

bash shell quotes

1
推荐指数
1
解决办法
171
查看次数

bash 在 for 中正确扩展变量

像这样的东西:

for i in a1 'a2 a3'
do
  echo ${i}
done
Run Code Online (Sandbox Code Playgroud)

我的理解是正确的:

a1
a2 a3
Run Code Online (Sandbox Code Playgroud)

虽然通过放入a1 'a2 a3'变量我无法让它工作

VAR="a1 'a2 a3'"

for i in ${VAR}
do
  echo ${i}
done
Run Code Online (Sandbox Code Playgroud)

在声明中如何声明VAR或使用它for

bash

1
推荐指数
1
解决办法
57
查看次数

当命令作为变量传递时,如何使用命令subsitution包含stdout/stderr重定向?

我有以下脚本来检测重新启动路由器后网络重新启动的时间:

#!/bin/bash
pingCommand="ping 192.168.1.1 -c 3 &>/dev/null"

while [[ ! $($pingCommand) ]]; do
   sleep 3s;
done
Run Code Online (Sandbox Code Playgroud)

但是,当在终端中运行时,它会打印:

ping:未知主机&>/dev/null

我使用-x选项运行脚本(以启用调试)并找到了

ping 192.168.1.1 -c 3 &>/dev/null
Run Code Online (Sandbox Code Playgroud)

正在子shell中执行

ping 192.168.1.1 -c 3 '&>/dev/null'
Run Code Online (Sandbox Code Playgroud)

如何更改命令替换调用,以便bash不在输出重定向周围放置单引号?

linux bash io-redirection command-substitution

0
推荐指数
1
解决办法
59
查看次数