我想创建一个脚本,它接受参数的文件路径,并将cds放入其文件夹中。 这就是我所做的:
#!/bin/bash
#remove the file name, and change every space into \space
shorter=`echo "$1" | sed 's/\/[^\/]*$//' | sed 's/\ /\\\ /g'`
echo $shorter
cd $shorter
我实际上有2个问题(我是shell脚本的相对新手):
我怎么能让cd“持久”?我想将此脚本放入/ usr / bin,然后从文件系统中的任何位置调用它。返回脚本后,我想留在$shorter
文件夹中。基本上,如果pwd是/ usr / bin,我可以通过键入. script /my/path
而不是./script /my/path
来实现,但如果我在另一个文件夹中该怎么办?
第二个问题比较棘手。只要给定参数中有空格,我的脚本就会失败。虽然$shorter
正是我想要的(例如/home/jack/my\ folder/subfolder
),但cd失败时会出现错误/usr/bin/script : line 4 : cd: /home/jack/my\: no file or folder of this type
。我想我已尝试过所有内容,使用cd '$shorter'
或cd "'"$shorter"'"
之类的内容无济于事。我错过了什么?
非常感谢您的回答
答案 0 :(得分:2)
在.bashrc
中添加以下行:
function shorter() { cd "${1%/*}"; }
%
表示从末尾删除较小的模式/*
是patern 然后在你的终端:
$ . ~/.bashrc # to refresh your bash configuration
$ type shorter # to check if your new function is available
shorter is a function
shorter ()
{
cd "${1%/*}"
}
$ shorter ./your/directory/filename # this will move to ./your/directory
答案 1 :(得分:1)
对于第一部分,根本不需要shorter
变量。你可以这样做:
#!/bin/bash
cd "${1%/*}"
大多数shell(包括bash
)都具有所谓的参数扩展,它们非常强大和高效,因为它们允许您在shell中通常需要调用来操作变量到外部二进制文件。
通过外部调用可以使用参数扩展的两个常见示例是:
${var%/*} # replaces dirname
${var##*/} # replaces basename
请参阅Parameter Expansion上的此常见问题解答以了解详情。事实上,虽然你可能会在整个常见问题解答中找到答案
答案 2 :(得分:1)
第一部分:
目录的更改将不会超出脚本的生命周期,因为您的脚本在新的shell进程中运行。但是,您可以使用shell别名或shell函数。例如,您可以将代码嵌入到shell函数中,并在.bash_profile
或其他源位置定义。
mycdfunction () {
cd /blah/foo/"$1"
}
至于“名称中的空格”位:
在Bourne shell中引用变量的一般语法是:"$var"
- "double quotes"
告诉shell 展开其中的任何变量,但是以分组将结果作为单个参数。
省略$var
周围的双引号会告诉shell扩展变量,但是将分割结果转换为空格上的参数(“单词”)。这就是shell通常分割参数的方式。
使用'single quotes'
导致shell 不展开任何内容,但分组参数togethers。
当你输入(或在脚本中)时,你可以使用\
(反斜杠空白)来逃避空间,但这通常比使用时更难阅读'single quotes'
或"double quotes"
...
请注意,扩展阶段包括:$variables
wild?cards*
{grouping,names}with-braces
$(echo command substitution)
以及其他效果。
| expansion | no expansion
-------------------------------------------------------
grouping | " " | ' '
splitting | (no punc.) | (not easily done)
答案 3 :(得分:1)
当您将脚本放在/usr/bin
内时,您可以在任何地方调用它。并且处理shell中的空格只是将目标放在“”之间(但这并不重要!!)。
那么这是一个演示:
#!/bin/bash
#you can use dirname but that's not apropriate
#shorter=$(dirname $1)
#Use parameter expansion (too much better)
shorter=${1%/*}
echo $shorter
答案 4 :(得分:1)
另一种方法,因为您的Mac上有dirname
:
#!/bin/sh
cd "$(dirname "$1")"
由于您在评论中提到您希望能够将文件拖到窗口中并cd
向它们添加,因此您可能希望使脚本允许文件或目录路径为参数:
#!/bin/sh
[ -f "$1" ] && set "$(dirname "$1")" # convert a file to a directory
cd "$1"