有用的BASH代码片断

我们有很多其他的语言。 用于C / C ++的是相当stream行的,所以相当于Python 。 我以为BASH的一个也会很有趣。

cd -去以前访问的目录:

 /usr/local/bin> cd /i/am/a/banana /i/am/a/banana> cd - /usr/local/bin> 

…然后有BASH for循环的所有有用的化身:

 for file in *.txt; do ls $file; done for item in $(echo foo bar baz); do echo $item; done for num in {0..9}; do echo $num; done 

在BASH脚本中,为变量分配一个参数,但是如果存在则提供一个默认参数:

 MYVAR=${1:-default} 

$ MYVAR将包含第一个参数,如果一个被赋予其他“默认”。

天儿真好,

我最喜欢的,它适用于其他支持别名的shell,是通过在命令前加一个反斜杠来临时禁用别名的简单方法。

所以:

 alias rm='rm -i' 

在进入rm时,总会给你交互模式,进入

 \rm 

在命令行上绕过别名。

HTH

干杯,

这不是很有用,但真的很有趣:

 history | awk '{print $2}' | awk 'BEGIN {FS="|"}{print $1}' | sort | uniq -c | sort -n | tail | sort -nr 

它打印10个最常用的命令。

编辑:这个问题是非常相似的。

很久以前在网上的某个地方发现了这个:

 function bashtips { cat <<EOF DIRECTORIES ----------- ~- Previous working directory pushd tmp Push tmp && cd tmp popd Pop && cd GLOBBING AND OUTPUT SUBSTITUTION -------------------------------- ls a[b-dx]e Globs abe, ace, ade, axe ls a{c,bl}e Globs ace, able \$(ls) \`ls\` (but nestable!) HISTORY MANIPULATION -------------------- !! Last command !?foo Last command containing \`foo' ^foo^bar^ Last command containing \`foo', but substitute \`bar' !!:0 Last command word !!:^ Last command's first argument !\$ Last command's last argument !!:* Last command's arguments !!:xy Arguments x to y of last command Cs search forwards in history Cr search backwards in history LINE EDITING ------------ Md kill to end of word Cw kill to beginning of word Ck kill to end of line Cu kill to beginning of line Mr revert all modifications to current line C-] search forwards in line MC-] search backwards in line Ct transpose characters Mt transpose words Mu uppercase word Ml lowercase word Mc capitalize word COMPLETION ---------- M-/ complete filename M-~ complete user name M-@ complete host name M-\$ complete variable name M-! complete command name M-^ complete history EOF } 

只有设置了变量才能添加空格(或其他分隔符),以避免不必要的空格。

 $ first=Joe $ last= # last name blank, the following echoes a space before the period $ echo "Hello, $first $last. Welcome to..." Hello, Joe . Welcome to... $ echo "Hello, $first${last:+ $last}. Welcome to..." Hello, Joe. Welcome to... $ last=Green $ echo "Hello, $first${last:+ $last}. Welcome to..." Hello, Joe Green. Welcome to... 

要删除.svn目录,你也可以使用'find …- prune …- exec …'(不包括xargs)的组合:

 # tested on Mac OS X find -x -E . \( -type d -regex '.*/\.svn/*.*' -prune \) -ls # test find -x -E . \( -type d -regex '.*/\.svn/*.*' -prune \) -exec /bin/rm -PRfv '{}' \; 

在必须以root用户身份运行的脚本开始处:

 if [ `id -u` != 0 ]; then echo "This script must be run as root" 1>&2 exit 1 fi 

这是另一个:

 #!/bin/bash # Shows the full path of files, good for copy pasting and for when # listing the full paths is necessary. # Usage: Run in the working directory (no path), otherwise takes the # same file specification as ls. for file in $(ls "$@"); do echo -n $(pwd) [[ $(pwd) != "/" ]] && echo -n / echo $file done 

这是一个很好的grep表达式来删除空行和注释行:

 grep -v '^[ \t]*$\|^[ \t]*#' /etc/ssh/sshd_config 

以上将显示在sshd_config使用的设置,没有任何混乱。

我们开发网站并在SVN中为他们存储代码。 转到生产时,我们不希望.svn目录显示出来。 以下代码递归目录并删除不需要的目录(可用于任何不需要的目录)。 尽管如此,不是严格的打击,而是有用的。

 find . -type d -name .svn | xargs rm -rf 

从产品的最上面的路径执行…当然要小心在错误的地方执行可能会导致非常糟糕的事情发生。

您也可以通过更改-type d到-type f来执行常规文件

我使用这个与Java开发结合的很多:

 #!/ bin / sh的

如果[“$ 1”==“”] ||  [“$ 2”==“”]; 然后
回声“用法jarfinder.sh”
    出口
科幻

 SEARCH =`echo $ 2 |  sed -e's /[\\\/]/./ g'`

 echo $ 1搜索罐子和拉链“$ SEARCH”

找到$ 1 -type f -printf“'%p'\ n”|  egrep“\。(jar | zip)'$”|  sed -e“s /\(.*\)/ echo \ 1; jar tvf \ 1 | sed -e's \ / ^ \ / \ /'| grep -i \”$ SEARCH \“/”|  SH

我保留在我方便的脚本中 。

我也用这个一行很多:

 find . -name "*.java" | xargs grep -li "yadayada" 

结束这一个:

 find . -name "*.java" | sed -e 's+\(.*\)+echo \1 ; yada_cmd \1+' | sh 
  !find:p ......... show last find command - not execute # create one dir and go to echo 'mkcd() { mkdir -p "$@" && cd $_; }' >> ~/.bashrc # backup file in single command cp /path/too/long/to/file{,.backup} 

如果你想在你的提示符( $PS1 )中使用当前的工作目录,在只有80列的终端上运行,有时候工作在非常深的层次结构中,那么最终的提示可能只有5个字符你的线。 在这种情况下,以下声明是有用的:

 PS1='${PWD##$PREFIX}$ ' PREFIX='' export PREFIX prefix () { PREFIX="$1" } prefix '*/' 

prefix '*/'调用将设置您的提示只包含当前工作目录的最后一个目录元素(而不是完整的路径)。 如果您想查看整个路径,请不带参数调用prefix

我喜欢反拨操作员。

 gcc `pkg-config <package> --cflags` -o foo.o -c foo.c 

和:

 hd `whereis -b ls | sed "s/ls: //"` | head 

了解我,我已经错过了一个更有效的方法来“摆脱二进制的hexdump,你不知道的位置……哦,很明显,”LS“可以换成一个所以在脚本中它会变得像这样:

 #!/bin/bash hd `whereis -b $1 | sed "s/$1: //"` | head 

上述的实际用处是相当有限的,但是以我的拙见来说,它反映了反向操作符(和bash shell)的多功能性。

总是包含太长时间,但解决方案如何操作shell脚本中的$ PATH元素? 对我来说很有用…

 : > truncate-file-to-zero-bytes.txt # without changing its permissions 

请参阅:codesnippets.joyent.com/posts/show/2067

我用它来缩进源代码四个空格,并将结果复制到X中的剪贴板:

 cat src/Something.java | sed -e 's/^/ /g' | xsel 

现在Something.java准备好被中间点击粘贴。 我知道我可以通过一个管道来减少表情,并且移除猫,但是我喜欢这种方式,因为我觉得在重新使用表达式的时候更容易编辑开头。

给定指定文件的完整规范文件路径的有效(直观)方法。 这将解决符号链接,相关文件引用等的所有情况。

 full_path="$(cd $(/usr/bin/dirname "$file"); pwd -P)/$(/usr/bin/basename "$file")" 

为了将组vboxusers所拥有的中的所有文件改为被用户组kent所拥有,我创建了一些东西。 但是,由于它在使用xargs方面存在一个弱点,所以我将其更改为在此评论中提出的解决方案:

 $ find ~ -group vboxusers -exec chown kent:kent {} \; 

我使用它来从相同的链接启动应用程序在他们自己的xterm窗口(或不)。

 #!/bin/bash # # cli_app launcher -- detects where u are launching from; gui/tty # dev=`/usr/bin/tty` case $dev in /dev/pts/0 | /dev/pts/1) xterm -e /home/user/bin/cli_app ;; ## opens gui terminal *) /home/user/bin/cli_app ;; ## opens where u are esac # eof #