在CentOS中使用Bash脚本导出

我对Linux非常陌生,在CentOS中应该是一个非常简单的Bash脚本。

#! /bin/bash # script to restore the cognos rds from snapshot export AWS_RDS_HOME=/opt/aws/apitools/rds export PATH=$PATH:$AWS_RDS_HOME/bin export AWS_CREDENTIAL_FILE=$AWS_RDS_HOME/credential-file-path.template echo $AWS_RDS_HOME echo $PATH echo $AWS_CREDENTIAL_FILE rds-delete-db-instance mydb --final-db-snapshot-identifier mydb-daily-$(date +%Y)-$(date +%m)-$(date +%d) --force -region eu-west-1 

我添加了回声,以便我可以看到发生了什么事情。 我运行时的输出

 sh myscript.sh 

是:

 /opt/aws/apitools/rds /bin/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin:/opt/aws/apitools/rds /credential-file-path.template rds-delete-db-instance: command not found 

所以,当我引用在同一脚本中设置的其他环境variables时,看起来导出命令不起作用。

我哪里错了?

谢谢

更新:我已经尝试了下面的build议,但不喜欢。 运行bash -x很有趣。 当我尝试连接时,下面的“\ r”是否可以放在后面? 例如

 #! /bin/bash # test script export AWS_RDS_HOME=/opt/aws/apitools/rds export PATH=$PATH:$AWS_RDS_HOME/bin export AWS_CREDENTIAL_FILE=$AWS_RDS_HOME/credential-file-path.template echo $AWS_RDS_HOME echo $PATH echo $AWS_CREDENTIAL_FILE 

结果是:

 + export $'AWS_RDS_HOME=/opt/aws/apitools/rds\r' + AWS_RDS_HOME=$'/opt/aws/apitools/rds\r' + export $'PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin:/opt/aws/apitools/rds\r/bin\r' + PATH=$'/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin:/opt/aws/apitools/rds\r/bin\r' + export $'AWS_CREDENTIAL_FILE=/opt/aws/apitools/rds\r/credential-file-path.template\r' + AWS_CREDENTIAL_FILE=$'/opt/aws/apitools/rds\r/credential-file-path.template\r' + echo $'/opt/aws/apitools/rds\r\r' /opt/aws/apitools/rds + echo $'/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/bin:/opt/aws/apitools/rds\r/bin\r\r' /usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home//binuser/bin:/opt/aws/apitools/rds + echo $'/opt/aws/apitools/rds\r/credential-file-path.template\r' /credential-file-path.template 

我在EC2上使用默认的Amazon Linux AMI,所以不应该有任何与我的设置时髦

您正在通过运行“sh myscript.sh”来执行脚本。 如果你使用“sh”来调用bash,bash将尝试“尽可能地模仿sh的历史版本的启动行为,同时符合POSIX标准”(根据bash的手册页,在调用部分)。

历史上的Bourne shell不能识别“export VARIABLE = value”。 在Bourne shell中导出variables的典型方法是“VARIABLE = value; export VARIABLE”,即设置值和导出是单独的命令。 把这一切作为一个命令是一个bash主义。

所以,你可以尝试调用你的脚本作为“bash myscript.sh”,这应该工作(它适用于我,虽然承认它也适用于“sh myscript.sh”调用;可能有一些有趣的东西在我的shell设置的地方,或在你的东西有趣)。 你也可以使用“chmod + x myscript.sh”使文件可执行,并且直接使用“./myscript.sh”运行它,因为它应该调用bash,根据“#!” 在第一行。

看起来你的脚本在每一行的末尾都有一个错误的回车符。 如果在其生命周期中的某个时刻脚本已经在Windows系统上编辑过,就会发生这种情况。 您可以尝试使用以下命令来修复它:

 perl -pi -e 's/\r//' myscript.sh 

由于错误的回车,它不是像你想的那样引用目录rds ,而是rds后跟一个回车符。 你大概没有这个名字的目录,假设rds-delete-db-instance存在于rds目录中,这就解释了为什么你command not found

您的脚本还有其他一些问题,我试图在这里解决:

 #!/bin/bash # script to restore the cognos rds from snapshot export AWS_RDS_HOME=/opt/aws/apitools/rds export PATH="$PATH:$AWS_RDS_HOME/bin" export AWS_CREDENTIAL_FILE="$AWS_RDS_HOME/credential-file-path.template" echo "$AWS_RDS_HOME" echo "$PATH" echo "$AWS_CREDENTIAL_FILE" rds-delete-db-instance mydb --final-db-snapshot-identifier "mydb-daily-$(date +%Y-%m-%d)" --force -region eu-west-1 

我在#!之后删除了空格#! 因为它通常不被使用,而且我相信这个脚本没有空间就可以稍微轻便一些。

我添加了"使用$字符的string”,这对于使用$产生的扩展包含任何特殊字符(包括空格)很重要。

另外,我将三个date命令改为一个。 如果脚本恰好在午夜之前开始,则使用单个date命令会更短且更健壮。

你可以尝试用double(“)引号括住这个位的右边吗?它可以在我的小testing中同时使用,虽然它不在CentOS上,但是在不同的linux上bash应该是相同的,所以我想。

当你input

sh myscript.sh

你正在用一组新的环境variables产生一个新的shell。 在shell中,variables$ AWS_RDS_HOME将包含值“/ opt / aws / apitools / rds”,但是当sh退出时,该上下文将消失。

这听起来像你想使用

。 myscript.sh

这是“点”,其次是“空间”,其次是文件名。 “dot”命令在当前shell的上下文中解释参数文件,因此导出的variables随后在当前shell中可用。

这是它在Centos /使用bash中为我工作的唯一方法。

 source myscript.sh 

要么

 . myscript.sh