答案 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?的解决方案对我来说非常有用......