标题是什么:将变量封装在{},""或者"{}" 是什么意思?"我无法在网上找到任何关于此的解释 - 除了使用符号之外我还没有能够引用它们不产生任何东西.
这是一个例子:
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}".如果有人能解释,我会很感激.
作为一个额外的问题 - 是否有人知道引用这些封装的可接受方式?
在shell脚本中,$@和之间有什么区别$*?
获取脚本参数的首选方法是哪一种?
不同的shell解释器之间是否存在差异?
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) 如何将一个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) 我注意到有时包装脚本将${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:+"$@"}成英语并解释为什么它会优于普通的优势"$@"吗?
UNIX $@和$*UNIX 之间的区别是什么?当在脚本中回显时,它们似乎都产生相同的输出.
我认为是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,或如何在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)
我该怎么办 ?
我想将一个字符串作为命令行参数传递给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")和单引号,但我没有得到预期的结果.
我如何获得预期的输出?
我写了一个脚本(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)