如何获取其中的目录路径的Bash脚本位于,里面那个脚本?
例如,假设我想使用Bash脚本作为另一个应用程序的启动器.我想将工作目录更改为Bash脚本所在的目录,因此我可以对该目录中的文件进行操作,如下所示:
$ ./application
我使用以下脚本来查看文件是否存在:
#!/bin/bash
FILE=$1
if [ -f $FILE ]; then
echo "File $FILE exists."
else
echo "File $FILE does not exist."
fi
Run Code Online (Sandbox Code Playgroud)
如果我只想检查文件是否不存在,使用的语法是什么?
#!/bin/bash
FILE=$1
if [ $FILE does not exist ]; then
echo "File $FILE does not exist."
fi
Run Code Online (Sandbox Code Playgroud) 在PHP中,字符串连接在一起如下:
$foo = "Hello";
$foo .= " World";
Run Code Online (Sandbox Code Playgroud)
在这里,$foo成为"Hello World".
在Bash中如何实现?
我在Bash中有一个字符串:
string="My string"
Run Code Online (Sandbox Code Playgroud)
如何测试它是否包含另一个字符串?
if [ $string ?? 'foo' ]; then
echo "It's there!"
fi
Run Code Online (Sandbox Code Playgroud)
??我的未知运营商在哪里?我是否使用echo grep?
if echo "$string" | grep 'foo'; then
echo "It's there!"
fi
Run Code Online (Sandbox Code Playgroud)
这看起来有点笨拙.
在Bash中,试过这个:
echo -e "hello\nworld"
Run Code Online (Sandbox Code Playgroud)
但它不会仅打印换行符\n.如何让它打印换行符?
我正在使用Ubuntu 11.04.
在Unix shell中,如果我想要组合stderr并stdout进入stdout流进行进一步操作,我可以在命令的末尾添加以下内容:
2>&1
Run Code Online (Sandbox Code Playgroud)
所以,如果我想head在输出上使用g++,我可以这样做:
g++ lots_of_errors 2>&1 | head
Run Code Online (Sandbox Code Playgroud)
所以我只能看到前几个错误.
我总是很难记住这一点,而且我不得不去查阅它,主要是因为我不完全理解这个特殊技巧的语法.
有人可以打破这个并按字符解释具体2>&1 意义吗?
我想分别获取文件名(没有扩展名)和扩展名.
我到目前为止找到的最佳解决方案是:
NAME=`echo "$FILE" | cut -d'.' -f1`
EXTENSION=`echo "$FILE" | cut -d'.' -f2`
Run Code Online (Sandbox Code Playgroud)
这是错误的,因为如果文件名包含多个.字符,它将不起作用.如果,让我们说,我有a.b.js,它会考虑a和b.js,而不是a.b和js.
它可以在Python中轻松完成
file, ext = os.path.splitext(path)
Run Code Online (Sandbox Code Playgroud)
但是如果可能的话,我宁愿不为此启动Python解释器.
有更好的想法吗?
我把这个字符串存储在一个变量中:
IN="bla@some.com;john@home.com"
Run Code Online (Sandbox Code Playgroud)
现在我想通过;分隔符拆分字符串,以便我有:
ADDR1="bla@some.com"
ADDR2="john@home.com"
Run Code Online (Sandbox Code Playgroud)
我不一定需要ADDR1和ADDR2变量.如果它们是阵列的元素甚至更好.
根据以下答案的建议,我最终得到了以下内容,这就是我所追求的:
#!/usr/bin/env bash
IN="bla@some.com;john@home.com"
mails=$(echo $IN | tr ";" "\n")
for addr in $mails
do
echo "> [$addr]"
done
Run Code Online (Sandbox Code Playgroud)
输出:
> [bla@some.com]
> [john@home.com]
Run Code Online (Sandbox Code Playgroud)
有一个涉及设置Internal_field_separator(IFS)的解决方案;.我不确定该答案发生了什么,你如何重置IFS为默认值?
RE:IFS解决方案,我试过这个并且它可以工作,我保持旧的IFS然后恢复它:
IN="bla@some.com;john@home.com"
OIFS=$IFS
IFS=';'
mails2=$IN
for x in $mails2
do
echo "> [$x]"
done
IFS=$OIFS
Run Code Online (Sandbox Code Playgroud)
顺便说一句,我试过的时候
mails2=($IN)
Run Code Online (Sandbox Code Playgroud)
我只是在循环打印时得到第一个字符串,没有括号围绕$IN它工作.
说,我有一个用这行调用的脚本:
./myscript -vfd ./foo/bar/someFile -o /fizz/someOtherFile
Run Code Online (Sandbox Code Playgroud)
或者这个:
./myscript -v -f -d -o /fizz/someOtherFile ./foo/bar/someFile
Run Code Online (Sandbox Code Playgroud)
什么是分析这使得在每一种情况下(或两者的组合)的接受的方式$v,$f以及 $d将全部设置为true和$outFile将等于/fizz/someOtherFile?