标签: parameter

参数拆分

我有一个 bash 脚本,它是另一个进程的简单包装器:

$ cat ~/bin/s3cmd
#!/bin/sh
trickle -u 80 ~/bin/s3cmd.py $*
$
Run Code Online (Sandbox Code Playgroud)

当参数不包含空格时,这很有效。但是,当传递给外部s3cmd脚本的参数包含空格时,它似乎会失败,即使这些在命令行上被转义。

我如何对此进行空白证明,以便将每个单个参数正确传递给s3cmd.py

shell bash parameter quoting

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

如何将 $@ 放在引号中?

我的 bash 脚本如下所示:

#!/bin/bash
grep -r --color=always $@ . | nolong
Run Code Online (Sandbox Code Playgroud)

文件保存在 /usr/bin/findstr

当我运行这个时一切正常:

findstr hello
Run Code Online (Sandbox Code Playgroud)

但是当我运行这个时:

findstr hello world
Run Code Online (Sandbox Code Playgroud)

它只搜索 hello。

问题:如何加上$@引号,以便它理解它是单个参数?

shell grep bash parameter quoting

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

从文件名的开头删除数字

我希望这会奏效:

$ find . -type f -exec basename {} \; | while EFS= read -r f; do echo "${f##[0-9]}"; done 
Run Code Online (Sandbox Code Playgroud)

但是,例如,对于命名为:

1foo
11bar

它返回:

foo
1bar

什么时候


是期待。

PS:归根结底,我要mv "$f"修改名字(还要做其他修改)

编辑:

PS2:如果您考虑PS,它不是重复的。无论如何,标记为检查的答案让我满意。

find parameter rename

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

请解释一下使用 IFS 进行这些参数扩展的行为?

我正在尝试弄清楚如何使用和${parameter%word}进行扩展。它首先尝试制作一个使用 Ghostscript 组合 pdf 的脚本,但我遇到了一些参数扩展的奇怪行为,现在我只是好奇为什么会发生这种行为。$@$*

基本上我试图从每个参数的末尾删除“.pdf”,然后用任意字符串将它们连接起来(我正在使用“-”进行测试),然后在结果的末尾添加“.pdf” 。例如,预期行为是test.sh a.pdf b.pdf c.pdf-> a-b-c.pdf。这是我正在运行的测试脚本:

IFS='-'

echo ${*%.pdf}.pdf
echo "${*%.pdf}.pdf"

a=${*%.pdf}.pdf
b="${*%.pdf}.pdf"
echo $a
echo $b
Run Code Online (Sandbox Code Playgroud)

如果我bash test.sh a.pdf b.pdf c.pdf,我得到:

a b c.pdf
a-b-c.pdf
a b c.pdf
a b c.pdf
Run Code Online (Sandbox Code Playgroud)

如果我zsh test.sh a.pdf b.pdf c.pdf,我得到:

a b c.pdf
a.pdf-b.pdf-c.pdf
a-b-c.pdf
a.pdf-b.pdf-c.pdf
Run Code Online (Sandbox Code Playgroud)

我知道 zsh 和 bash 是不同的,所以我不担心为什么它们给出不同的结果。然而,在每种情况下,构建字符串的 4 种方法中只有一种能够按预期工作(第二种用于 bash,第三种用于 zsh)。

为什么这些看似相似的构造字符串的尝试会产生如此不同的结果?任何见解都值得赞赏。谢谢!

bash zsh parameter shell-script quoting

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

在 bash shell 脚本中,$2 可以等于命令行上的多个参数,还是我需要 $3、$4 等...?

在下面的示例脚本中,它用于发送到一个或两个电子邮件地址,具体取决于哪个进程正在使用该脚本。我需要为额外的电子邮件地址添加 3 美元,还是 2 美元就足够了?

(
for file in /usr/app/tst/$1/MS_CASE_ST*.csv;
do
   uuencode ${file} $(basename ${file})
done
) | mailx -s "MS_CASE_ST*.csv file contains data. Please Research" $2 
Run Code Online (Sandbox Code Playgroud)

脚本 example.sh 如何执行的示例:

$ ./example.sh output email-1@web.com email-2@web.com
Run Code Online (Sandbox Code Playgroud)

scripting bash parameter

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

为什么在 sudo su 之后缺少传递给 .sh 文件的参数?

我需要.sh从本地机器在我的服务器上运行文件。我可以使用以下命令来完成。

ssh -p my_port_no -i path_to_key user@ip_address "bash -s" < testOnServer.sh
Run Code Online (Sandbox Code Playgroud)

现在我需要使用上述命令传递一些参数。我按照下面的方法做了,成功了。

ssh -p my_port_no -i path_to_key user@ip_address "bash -s" < testOnServer.sh testArg1
Run Code Online (Sandbox Code Playgroud)

我的testOnServer.sh文件如下。

testArg1=$1

echo testArg1   # testArg1 can be seen here.
sudo su
echo testArg1 # testArg1 is missing here.
Run Code Online (Sandbox Code Playgroud)

命令testArg1后缺少的值sudo su

任何帮助都受到高度赞赏。

sudo parameter shell-script arguments

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

如何将参数扩展与命令替换一起使用?

    \n
  • 我想创建 12 个以月份命名的目录。因此,我尝试使用locale管道来获取月份名称,用逗号tr分隔它们,然后用大括号括起来并传递给mkdir. 但整体被视为一根弦。有办法避免这种情况吗?
  • \n
\n
16:07: temp \xe2\xa7\xb2 mkdir {$(locale mon | tr \\; ,)}\n\n16:18: temp \xe2\xa7\xb2 ls -lh\ntotal 4.0K\ndrwxr-xr-x. 2 john john 4.0K Dec 11 16:18 {January,February,March,April,May,June,July,August,September,October,November,December}\n\n16:18: temp \xe2\xa7\xb2 \n
Run Code Online (Sandbox Code Playgroud)\n

shell bash parameter command-substitution

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