Articles of bash

Shell脚本问题,包含空格的文件名

我知道处理文件名空间的一种方法是用单引号括起文件名:“'”。 为什么下面的代码叫做“echo.sh”,在包含带空格的文件名的目录下工作,但程序“ls.sh”不起作用,唯一的区别是'echo'被'ls'replace? echo.sh #!/bin/sh for f in * do echo "'$f'" done 生产 : 'ABC' “高清” 'echo.sh' 'ls.sh' 但是,“ls.sh”失败: #!/bin/sh for f in * do ls "'$f'" done 生产 : ls:不能访问'ab c':没有这样的文件或目录 ls:不能访问'de f':没有这样的文件或目录 ls:不能访问'echo.sh':没有这样的文件或目录 ls:不能访问'ls.sh':没有这样的文件或目录

不能创build/ dev / stdout:没有这样的设备或地址

我想通过节点运行一个shell命令并捕获stdout的结果。 我的脚本在OSX上正常工作,但不在Ubuntu上。 我已经将问题和脚本简化为以下节点脚本: var execSync = require('child_process').execSync, result = execSync('echo "hello world" >> /dev/stdout'); // Do something with result 结果是: / bin / sh:1:不能创build/ dev / stdout:没有这样的设备或地址 我试图用/dev/stdout /dev/fd/1replace/dev/stdout 我已经尝试将shell更改为bash … execSync('echo …', {shell : '/bin/bash'}) 就像我说的,上面的问题被简化了。 真正的脚本接受作为参数的结果应写入文件的名称,所以我需要通过提供对stdoutstream作为文件描述符(即/dev/stdout访问来解决此问题。 我怎样才能通过节点执行命令,同时给命令访问它自己的标准输出stream?

如何使用bash监视目录中新创build的文件?

我有一个由大量日志文件组成的日志目录,一旦系统事件发生,就会创build一个日志文件。 我想写一个总是监视文件列表并在terminal上显示新创build文件的内容的online bash脚本。 这是它的样子: 目前,我所拥有的只是显示整个目录的内容: for f in *; do cat $f; done 它缺乏我想要的监视function。 我的系统的一个局限是我没有 watch命令。 我也没有任何包pipe理器来安装花哨的工具。 原始的BSD是我所有的。 我有tail ,我正在想像tail -F $(ls)但这尾巴每个文件,而不是文件列表。 总之,我想修改我的脚本,以便我可以监视所有新创build的文件的内容。

Bash脚本命令不能在cron中工作

我有以下bash脚本来读取日志,并检查蛮力,然后阻止使用iptables IP。 #!/bin/bash #blah blah run some commands to get the IP iptables -A INPUT -s $p -j REJECT –reject-with icmp-host-prohibited echo "BANNED $p FOR $COUNT ATTEMPTS" |wall 我做了chmod 755.当我从terminal运行命令,它工作正常。 但是当我使用crontab -e作为root设置一个cronjob时,它得到IP,并且回显“BANNED …”消息到墙上,但是没有任何东西被添加到iptables列表中。 PS。 我试过#!/bin/bash和#!/bin/sh但没有运气。

使用AWK从两个文件中分解n个列

我有两个N列数的文件 文件1: A 1 2 3 ……. Na1 B 2 3 4 ……. Nb1 文件2: A 2 2 4 ……. Na2 B 1 3 4 ……. Nb2 我想要一个输出从File1的第一列值将被从File2的第一列中减去,这样直到列N如下所示: A -1 0 -1 …….. (Na1-Na2) B 1 0 0 …….. (Nb1-Nb2) 如何在Linux环境中执行AWK或Perl脚本?

如何使用awk将文件的某个字段更改为大写?

我有这样的文本文件: 1 http http 3 4 5 2 dns dns 4 3 ftp ftp 4 5 6 8 我想输出是这样的: 1 HTTP http 3 4 5 2 DNS dns 4 3 FTP ftp 4 5 6 8 我想把第二个字段从小写变成大写,只有第二个字段。 请注意,某一行中的字段数量不固定。 我可以用awk完成这个目标吗?

freeTDS bash:在Microsoft SQL Server中执行sql查询

我可以使用freeTSD和命令行通过Mint Linux VM连接到Microsoft SQL Server 2008实例,以在其上执行sql语句。 现在我想在bash脚本中自动化这个。 我能够成功login我的bash脚本: TDSVER=8.0 tsql -H servername -p 1433 -D dbadmin -U domain\\Administrator -P password 然后我有我的SQL查询: USE dbname GO delete from schema.tableA where ID > 5 GO delete from schema.tableB where ID > 5 GO delete from schema.tableC where ID > 5 GO exit 这在通过freeTSD命令行手动执行时有效,但不能在我放入bash文件时使用。 我跟着这个post: freeTSD&bash 。 这是我的bash脚本示例: echo […]

使用input/输出redirect在后台运行进程

我很想知道,当进程有input/输出redirect来在后台运行进程时,在代码中使用“&”运算符是否有所不同 在后台运行进程方面,这两行代码之间有什么区别? 如果有的话,我怎样才能确定分歧将是什么? setsid python script.py < /dev/zero &> log.txt & setsid python script.py < /dev/zero & > log.txt & setsid python script.py < /dev/zero > log.txt & setsid python script.py & < /dev/zero > log.txt

recursion地“规范化”文件名

我的意思是摆脱特殊字符的文件名等 我已经做了一个脚本,可以recursion重命名文件[http://pastebin.com/raw.php?i=kXeHbDQw]: 例如:之前: THIS is my file (1).txt 运行脚本之后: This-is-my-file-1.txt 好。 这里是: 但是:当我想要“完全”testing它,像这样的文件名: ¤¥¦§¨©ª«¬®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÂÃÄÅÆÇÈÊËÌÎÏÐÑÒÔÕ×ØÙUÛUÝÞßàâãäåæçèêëìîïðñòôõ÷øùûýþÿ.txt áíüűúöőóéÁÍÜŰÚÖŐÓÉ!"#$%&'()*+,:;<=>?@[\]^_`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ''“”•–—˜™š›œžŸ¡¢£.txt 它失败[http://pastebin.com/raw.php?i=iu8Pwrnr]: $ sh renamer.sh directorythathasthefiles mv: cannot stat `./áíüűúöőóéÁÍÜŰÚÖŐÓÉ!"#$%&\'()*+,:;<=>?@[]^_`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ''“”•–—˜™š›œžŸ¡¢£': No such file or directory mv: cannot stat `./áíüűúöőóéÁÍÜŰÚÖŐÓÉ!"#$%&\'()*+,:;<=>?@[]^_`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ''“”•–—˜™š›œžŸ¡¢£': No such file or directory mv: cannot stat `./áíüűúöőóéÁÍÜŰÚÖŐÓÉ!"#$%&\'()*+,:;<=>?@[]^_`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ''“”•–—˜™š›œžŸ¡¢£': No such file or directory mv: cannot stat `./áíüűúöőóéÁÍÜŰÚÖŐÓÉ!"#$%&\'()*+,:;<=>?@[]^_`{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ''“”•–—˜™š›œžŸ¡¢£': No such file or […]

使用排除列表查找在bash中查找的目录

现在,在你认为“之前已经完成”的情况下,请继续阅读。 和大多数试图findbash脚本的人一样,你最终将脚本硬编码为一行命令,但最终会在接下来的几个月/几年里编辑这个东西,所以你最终希望你做对了第一次。 我正在编写一个小的备份程序来做备份目录,并且需要find它们,而不是需要排除的directorie列表。 说起来容易做起来难。 让我来设置舞台: #!/bin/bash BasePath="/home/adesso/baldar" declare -a Iggy Iggy=( "/cgi-bin" "/tmp" "/test" "/html" "/icons" ) IggySubdomains=$(printf ",%s" "${Iggy[@]}") IggySubdomains=${IggySubdomains:1} echo $IggySubdomains exit 0 现在在这个结尾你得到/ cgi-bin,/ tmp,/ test,/ html,/图标这certificate了这个概念的作用,但现在需要进一步我需要使用find来searchBasePath并search只有一个级别的所有子目录,并排除列表中的子目录… 如果我手工input它将是: find /var/www/* \( -path '*/cgi-bin' -o -path '*/tmp' -o -path '*/test' -o -path '*/html' -o -path '*/icons' \) -prune -type d 我应该也许想循环到每个子目录,并做同样的事情…我希望你明白我的观点。 所以我试图做的似乎是可能的,但我有一个问题, printf“,%s”不喜欢我使用所有这些发现-path或-o选项。 […]