为什么在运行脚本时找不到[[:未找到?


15

我正在尝试编写一个脚本,该脚本必须检查文件是否存在。在控制台中,我写

if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

我得到

not mod

但是当我编写脚本执行相同的操作时:

#!/bin/sh
if [[ -a /path/to/file.txt ]]; then echo "not mod"; else echo "mod"; fi

然后执行脚本,我得到以下信息:

./ex.sh: 2: [[: not found
mod

我将脚本保存在当前目录中,并将其命名为ex.sh,然后确保该脚本可执行。要调用脚本,我需要这样做:

./ex.sh

为什么会出现这个问题?我已经尝试了很多东西:

if [ -a /home ...

if test -a /home ...

他们俩都回来了

13: -a: unexpected operator

我能够使其工作,但为此我不得不删除第一行(#!/ bin / sh)您知道为什么会这样吗?
2012年

试试#!/bin/bash
kev 2012年

您好kev,我也提到了。我刚刚更新了我的问题。我花了太多时间在此上,但是我很高兴我能解决它。感谢您的回答。的确是解决问题的方法。
Buzu 2012年

@Kev请作为答复发布
slhck 2012年

Buzu,@ Kev-如果找到答案,请在下面将其发布为答案,请勿编辑问题。
user1686

Answers:


10

您正在sh下运行为bash编写的脚本,该脚本缺少许多扩展的语法功能– 是内置命令,在中不可用。[[bashsh

更改#!/bin/sh#!/bin/bash#!/usr/bin/env bash


在某些系统上,/bin/sh是的符号链接/bin/bash。假设bash是,这可能是相当安全的/bin/bash
基思·汤普森

@Keith:它/bin/bash在大多数Linux系统上,但是/usr/pkg/bin/bash在BSD上,或者/usr/local/bin/bash直接从源代码编译。
user1686 2012年

@grawity:或者如果您从源代码编译,则您决定将其放到任何其他地方。好的,很好。就我个人而言,我宁愿为每个系统编辑Shebang,也不愿使用/usr/bin/envhack(使用目前bash恰巧在调用者$PATH中使用的hack ),而是使用YMMV。(并且您可以进行/bin/bash符号链接-如果您具有管理员权限,并且不介意与之混为一谈/bin。)
Keith Thompson

@Keith:/usr/local自动工具决定默认放置它的位置。就“个人而言”而言,我喜欢从同一脚本/工具存储库中提取多个不同的服务器和VM,并且无需在每次提交后重新编辑其中一半的shebang。
user1686'1

他们都没有为我工作:/ im on centos
astroanu 2015年

0

运行脚本时,请指定bash而不是sh。我个人注意到在Ubuntu 12.10下它们是不同的:

bash script.sh arg0 ... argn

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.