当 bash 脚本源自 tcsh 时,while 命令不起作用?

当 bash 脚本源自 tcsh 时,while 命令不起作用?

我制作了一个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 进程中的变量,则有更简单的解决方案(请参阅其他答案)。

相关内容