我制作了一个bash
包含while
命令的 shell 脚本,但是当我在终端上使用命令运行脚本时source
,它给出了语法错误消息。
我需要使用,source
因为我必须在终端上设置环境变量,没有source
.
echo $shell
给出:/bin/csh
shell 不是给出
的交互式输出ps -p $$
CMD : tcsh
脚本是:
#! /bin/bash
i=1
while read line
do
echo "$line $i"
echo
i=$((i+1))
done < seed.txt
错误是:
i=1: Command not found.
while: Expression Syntax.
答案1
这个错误?
$ tcsh
tcsh> source while.sh
i=1: Command not found.
while: Expression Syntax.
tcsh> exit
Csh/tcsh 是与 POSIX sh 或 Bash 不同的 shell。尝试在 (t)csh 中以 sh 语法运行脚本是行不通的。
我需要使用,
source
因为我必须在终端上设置环境变量,没有source
.
使其成为实际导出的环境变量setenv
:
tcsh> cat hello.sh
echo "hello, $name"
tcsh> bash hello.sh
hello,
tcsh> setenv name vikas
tcsh> bash hello.sh
hello, vikas
答案2
以下是如何运行巴什shell 脚本,并基于该更改tcsh变量(如果这确实是您需要的):
编写shell脚本myscript.bash像这样:
ANSWER="$((6*7)) 'quoted'"
echo "setenv answer '${ANSWER//\'/\'\\\'\'}'"
然后从 tcsh 运行它:
bash myscript.bash >myscript.tcsh.out
source myscript.tcsh.out
echo "$answer"
这将打印:
42 'quoted'
${ANSWER//\'/\'\\\'\'}
如果值包含单引号 ( '
),则替换会使其起作用。"
如果值包含空格,则使用双引号 ( ) 可以使其起作用。
可以将多个变量发送到tcsh,通过添加 morecho "setenv ..."
线。
但是,如果可以启动新的(子)shell 而不是更改现有 shell 进程中的变量,则有更简单的解决方案(请参阅其他答案)。