有用的BASH代码片段

时间:2009-06-08 16:07:02

标签: linux bash

我们已经有很多其他语言。 C/C++的那个很受欢迎,因此Python也相当。我认为BASH的一个也很有趣。

21 个答案:

答案 0 :(得分:18)

cd -转到以前访问过的目录:

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

......然后是BASH for-loop的所有有用的化身:

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

答案 1 :(得分:14)

在BASH脚本中,为变量指定一个参数,但如果存在则提供默认值:

MYVAR=${1:-default}

$ MYVAR将包含第一个参数,如果给出其他参数“default”。

答案 2 :(得分:11)

天儿真好,

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

所以:

alias rm='rm -i'
输入rm,进入

时,

总是会给你交互模式

\rm
命令行上的

会绕过别名。

HTH

欢呼声,

答案 3 :(得分:6)

这不是很有用,但非常有趣:

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

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

编辑:这个问题与this非常相似。

答案 4 :(得分:5)

很久以前在网上找到了这个:

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
!!:x-y      Arguments x to y of last command
C-s     search forwards in history
C-r     search backwards in history

LINE EDITING
------------
M-d     kill to end of word
C-w     kill to beginning of word
C-k     kill to end of line
C-u     kill to beginning of line
M-r     revert all modifications to current line
C-]     search forwards in line
M-C-]       search backwards in line
C-t     transpose characters
M-t     transpose words
M-u     uppercase word
M-l     lowercase word
M-c     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
}

答案 5 :(得分:3)

仅在设置变量时添加空格(或其他分隔符),以避免丑陋的不必要空格。

$ 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...

答案 6 :(得分:2)

这是一个很好的grep表达式,用于删除空白行和注释行:

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

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

答案 7 :(得分:2)

在必须以root身份运行的脚本开头:

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

答案 8 :(得分:2)

这是另一个:

#!/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

答案 9 :(得分:2)

要删除.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 '{}' \; 

答案 10 :(得分:1)

如果您希望在提示符($PS1)中拥有当前工作目录,并且在一个只有80列的终端中运行,并且有时在非常深的层次结构中工作,则最终可能会出现提示你的线上只有5个字符。在这种情况下,以下声明是有用的:

PS1='${PWD##$PREFIX}$ '

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

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

答案 11 :(得分:1)

我们在SVN中为他们开发网站并存储代码。转向生产时,我们不希望显示.svn目录。以下代码递归目录并删除不需要的目录(可用于任何不需要的目录)。不是严格意义上的打击,但仍然有用。

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

从产品中最顶层的路径执行...当然要小心,因为在错误的地方执行会导致非常糟糕的事情发生。

您还可以通过将-type d更改为-type f

来执行常规文件

答案 12 :(得分:1)

我喜欢反击操作符。

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)的多功能性。

答案 13 :(得分:1)

 !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}

答案 14 :(得分:1)

我结合Java开发使用了这个:

#!/bin/sh

if [ "$1" == "" ] || [ "$2" == "" ]; then
echo "Usage jarfinder.sh  "
    exit
fi

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

echo Searching jars and zips in $1 for "$SEARCH"

find $1 -type f -printf "'%p'\n" | egrep "\.(jar|zip)'$" | sed -e "s/\(.*\)/echo \1 ; jar tvf \1 | sed -e 's\/^\/ \/' | grep -i \"$SEARCH\"/" | sh

我保留在collection of handy scripts

我也经常使用这种单行:

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

结束这一个:

find . -name "*.java" | sed -e 's+\(.*\)+echo \1 ; yada_cmd \1+' | sh

答案 15 :(得分:0)

我使用它来从同一个链接在自己的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 #

答案 16 :(得分:0)

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

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

答案 17 :(得分:0)

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

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

答案 18 :(得分:0)

我使用它将源代码缩进四个空格并将结果复制到X:

中的剪贴板
cat src/Something.java | sed -e 's/^/    /g' | xsel

现在,Something.java已准备好通过中间点击进行粘贴。我知道我可以通过一个管道减少表达式并移除cat,但我喜欢这种方式,因为我发现在重新使用表达式时更容易编辑开头。

答案 19 :(得分:0)

要更改由 vboxusers 组拥有的中的所有文件,而不是由用户组kent拥有,我创建了一些内容。但由于它在使用xargs方面存在缺陷,我将其更改为对此答案的评论中提出的解决方案:

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

答案 20 :(得分:0)

总计要包含的时间太长了,但How do I manipulate $PATH elements in shell scripts?的解决方案对我来说非常有用......