相关疑难解决方法(0)

Bash shell中$ {var},"$ var"和"$ {var}"之间有什么区别?

标题是什么:将变量封装在{},""或者"{}" 是什么意思?"我无法在网上找到任何关于此的解释 - 除了使用符号之外我还没有能够引用它们不产生任何东西.

这是一个例子:

declare -a groups

groups+=("CN=exampleexample,OU=exampleexample,OU=exampleexample,DC=example,DC=com")
groups+=("CN=example example,OU=example example,OU=example example,DC=example,DC=com")
Run Code Online (Sandbox Code Playgroud)

这个:

for group in "${groups[@]}"; do
    echo $group
done
Run Code Online (Sandbox Code Playgroud)

证明与此有很大不同:

for group in $groups; do
    echo $group
done
Run Code Online (Sandbox Code Playgroud)

还有这个:

for group in ${groups}; do
    echo $group
done
Run Code Online (Sandbox Code Playgroud)

只有第一个完成我想要的东西:遍历数组中的每个元素.我不是之间的差异是很清楚$groups,"$groups",${groups}"${groups}".如果有人能解释,我会很感激.

作为一个额外的问题 - 是否有人知道引用这些封装的可接受方式?

variables syntax bash shell

114
推荐指数
3
解决办法
7万
查看次数

shell脚本中的$ @和$*有什么区别?

在shell脚本中,$@和之间有什么区别$*

获取脚本参数的首选方法是哪一种?

不同的shell解释器之间是否存在差异?

shell scripting

52
推荐指数
2
解决办法
2万
查看次数

How do I pass a wildcard parameter to a bash file

I'm trying to write a bash script that allows the user to pass a directory path using wildcards.

For example,

bash show_files.sh *
Run Code Online (Sandbox Code Playgroud)

when executed within this directory

drw-r--r--  2 root root  4.0K Sep 18 11:33 dir_a
-rw-r--r--  1 root root   223 Sep 18 11:33 file_b.txt
-rw-rw-r--  1 root root   106 Oct 18 15:48 file_c.sql
Run Code Online (Sandbox Code Playgroud)

would output:

dir_a
file_b.txt
file_c.sql
Run Code Online (Sandbox Code Playgroud)

The way it is right now, it outputs:

dir_a
Run Code Online (Sandbox Code Playgroud)

contents of show_files.sh:

#!/bin/bash

dirs="$1"

for dir in $dirs
do …
Run Code Online (Sandbox Code Playgroud)

linux parameters bash wildcard

31
推荐指数
2
解决办法
2万
查看次数

在shell脚本之间传递参数但保留引号

如何将一个shell脚本的所有参数传递给另一个?我已经尝试了$*,但正如我所料,如果你引用了参数,那就不行了.

例:

$ cat script1.sh

#! /bin/sh
./script2.sh $*

$ cat script2.sh

#! /bin/sh
echo $1
echo $2
echo $3

$ script1.sh apple "pear orange" banana
apple
pear
orange
Run Code Online (Sandbox Code Playgroud)

我希望它打印出来:

apple
pear orange
banana
Run Code Online (Sandbox Code Playgroud)

shell argument-passing

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

/ bin/sh中的$ {1:+"$ @"}

我注意到有时包装脚本将${1:+"$@"}用于参数而不仅仅是"$@".

例如,http://svn.macosforge.org/repository/macports/trunk/dports/editors/vim-app/files/gvim.sh使用

exec "$binary" $opts ${1:+"$@"}
Run Code Online (Sandbox Code Playgroud)

任何人都可以分解${1:+"$@"}成英语并解释为什么它会优于普通的优势"$@"吗?

shell

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

UNIX中的$ @和$*有什么区别?

UNIX $@$*UNIX 之间的区别是什么?当在脚本中回显时,它们似乎都产生相同的输出.

unix variables shell

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

如果xargs是map,那么什么是过滤器?

我认为是xargsUNIX shell的map函数.功能是什么filter

编辑:看起来我必须更明确一点.

假设我必须提交一个接受单个字符串作为参数的程序,并返回退出代码0或1.该程序将作为它接受的字符串的谓词.

例如,我可能决定将字符串参数解释为文件路径,并将谓词定义为"此文件是否存在".在这种情况下,程序可以是test -f,给定一个字符串,如果文件存在则退出0,否则退出1.

我还必须交出一串串.例如,我可能有一个~/paths包含的文件

/etc/apache2/apache2.conf
/foo/bar/baz
/etc/hosts
Run Code Online (Sandbox Code Playgroud)

现在,我想创建一个新文件,~/existing_paths只包含我文件系统中存在的那些路径.就我而言,那就是

/etc/apache2/apache2.conf
/etc/hosts
Run Code Online (Sandbox Code Playgroud)

我想通过读取~/paths文件,通过谓词过滤这些行test -f,并将输出写入来完成此操作~/existing_paths.通过类比xargs,这看起来像:

cat ~/paths | xfilter test -f > ~/existing_paths
Run Code Online (Sandbox Code Playgroud)

这是xfilter我正在寻找的假设程序:

xfilter COMMAND [ARG]...
Run Code Online (Sandbox Code Playgroud)

对于L其标准输入的每一行,将调用COMMAND [ARG]... L,如果退出代码为0,则打印L,否则不打印任何内容.

要明确,我不是在寻找:

  • 一种过滤存在的文件路径列表的方法.这是一个具体的例子.
  • 怎么写这样的程序.我能做到.

正在寻找:

  • 一个预先存在的实现,比如xargs,或
  • 明确解释为什么不存在这一点

shell map filter xargs

12
推荐指数
3
解决办法
1862
查看次数

如何在find exec中运行子命令

如何在find的exec中运行子命令?例如,如果我只想从完整路径获取文件名并打印它,我会开火,

find ./ -name "*.csv" -exec echo $(basename {}) \;
Run Code Online (Sandbox Code Playgroud)

其中echo是子命令basename的父命令.

但结果与此相同,

find ./ -name "*.csv" -exec echo {} \;
Run Code Online (Sandbox Code Playgroud)

我该怎么办 ?

shell

7
推荐指数
2
解决办法
1394
查看次数

如何将字符串作为bash脚本的命令行参数传递?

我想将一个字符串作为命令行参数传递给bash脚本; 我的bash脚本只是:

>cat test_script.sh

for i in $*
do 
echo $i
done
Run Code Online (Sandbox Code Playgroud)

我打字了

bash test_script.sh test1 test2"test3 test4"

输出:

test1
test2
test3
test4
Run Code Online (Sandbox Code Playgroud)

输出我期待:

test1
test2
test3 test4
Run Code Online (Sandbox Code Playgroud)

我尝试使用反斜杠(test1 test2"test3\test4")和单引号,但我没有得到预期的结果.

我如何获得预期的输出?

bash

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

bash脚本:循环参数

我写了一个脚本(replace.sh),用〜\n替换〜.我想知道如何用多个参数调用这个脚本.

#!/bin/bash

for i in "$*"
 do
  sed 's/~/~\n/g' "$i"
done
Run Code Online (Sandbox Code Playgroud)

例如,我想调用./replace.sh text1 text2.它无法阅读

text1的内容是:1~1~1.调用脚本之后应该是

1 ~
1 ~
1 ~
Run Code Online (Sandbox Code Playgroud)

unix shell sed

5
推荐指数
0
解决办法
335
查看次数