Questions tagged «bash-expansion»

与其他Bourne / POSIX shell相对,GNU的Bourne Again SHell特有的问题。对于一般关于Unix shell的问题,请改用/ shell标记。对于具有错误/语法错误的shell脚本,请在此处发布之前,使用shellcheck程序(或在Web shellcheck服务器中的https://shellcheck.net)进行检查。

4
转义变量以用作另一个脚本的内容
这个问题与如何编写正确转义​​的字符串文字无关。我找不到任何有关如何转义变量以直接在脚本或其他程序中使用的相关问题。 我的目标是使一个脚本能够生成其他脚本。这是因为生成的脚本中的任务将在另一台计算机上运行0到n次,并且生成它们的数据可能会在运行之前(再次)更改,因此直接通过网络进行操作将不行。 给定一个可能包含特殊字符(例如单引号)的已知变量,我需要将其写为完全转义的字符串文字,例如,一个foo包含的变量bar'baz应在生成的脚本中显示为: qux='bar'\''baz' 通过附加"qux=$foo_esc"到脚本的其他行来编写。我是这样用Perl做到的: foo_esc="'`perl -pe 's/('\'')/\\1\\\\\\1\\1/g' <<<"$foo"`'" 但这似乎太过分了。 我仅靠bash并没有取得成功。我尝试了这些的许多变体: foo_esc="'${file//\'/\'\\\'\'}'" foo_esc="'${file//\'/'\\''}'" 但是要么多余的斜杠出现在输出中(当我这样做时echo "$foo"),否则它们会导致语法错误(如果从shell进行操作,则需要进一步的输入)。

3
如何从bash的文件名扩展机制中排除某些文件?
我在根目录中有ubuntu文件系统目录,而我不小心将数百个文件复制到了根目录中。 我直觉地试图通过排除文件系统来删除复制的文件,例如 rm -rf !{bin,sbin,usr,opt,lib,var,etc,srv,libx32,lib64,run,boot,proc,sys,dev} ./. 但它不起作用。在删除整个目录时排除某些目录的正确方法是什么? 编辑:切勿在不知所措的情况下尝试此处的任何命令!

3
bash [[]]命令中的自动变量扩展
在中取消引用变量时bash,必须使用$符号。不过,似乎以下各项工作正常: x=5 [[ x -gt 2 ]] 有人可以解释吗? 编辑:(更多信息) 我的意思是[[]]命令如何以及为什么取消引用不带$号的变量x。是的,如果x = 1,则该语句的计算结果为false(返回状态1)

1
bash扩展的glob-匹配不带前缀的文件
我正在尝试为fail2ban监狱匹配文件名-所以我只需要使用文件名遍历-而不是正则表达式或bash脚本。 我的/var/log/apache2目录包含以下文件: example.com.error.log db.example.com.error.log app1.example.com.error.log app2.example.com.error.log 我正在尝试创建一个glob来匹配以结尾的所有文件,.error.log 除了 db.example.error.log -这可能吗? 我已经尝试过了,!(db)*.error.log但这仍然匹配db.example.com.error.log。我猜的!()是没有字符匹配,从而允许*从文件名的开头进行匹配。 注意:appX添加新的日志文件时,我不需要扩展glob ,因此无法使用@()当前已知的非db文件名列表。 (背景:我想创建一个过滤器,禁止任何人在db.example.com 以外的任何域上请求任何phpMyAdmin URL )



3
外壳扩展(A | B)的文件名?
or例如,当读取文件时,是否可以在shell中扩展选择范围。 我的意思是,例如,它grep支持类似于(A|B)文件中的A或B的语法。 同样,如果我有这些文件: file1.txt file2.txt file3.txt file4.txt file5.txt 我能做到cat file{1..5}.txt的bash,因为它扩大了范围。是否有等效的方法仅对几个文件执行此操作? 例如cat file(1|5).txt,仅打印那些2?

6
如何创建每个月命名的目录?
我想为每个月创建一个目录名称。我知道,在玩了一些shell之后,我知道: date -d 1/01 +%b # Gives Jan date -d 2/01 +%b # Gives Feb . date -d 12/01 +%b # Gives Dec 因此,我使用了花括号扩展,echo {1..12}/01并尝试了xargs它: echo {1..12}/01 | xargs -n 1 -I {} date -d {} +%b 但这失败了:/(此后我想申请mkdir)。我怎样才能做到这一点?

5
为什么不对由$()中的命令打印的{1,2}进行插值?
我所在的目录中有两个文本文件: $ touch test1.txt $ touch test2.txt 当我尝试使用某种模式列出文件(使用Bash)时,它可以工作: $ ls test?.txt test1.txt test2.txt $ ls test{1,2}.txt test1.txt test2.txt 但是,当使用内含的命令生成模式时$(),只有一种模式有效: $ ls $(echo 'test?.txt') test1.txt test2.txt $ ls $(echo 'test{1,2}.txt') ls: cannot access test{1,2}.txt: No such file or directory 这里发生了什么?为什么该模式{1,2}不起作用?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.