【问题标题】:ksh syntax error: `if' unmatchedksh 语法错误:“如果”不匹配
【发布时间】:2016-02-26 10:29:30
【问题描述】:

我是 ksh 世界的新手,我现在遇到了一个脚本问题。此行下的脚本位于 UNIX 机器中用户的 .profile 文件中,当我尝试与他连接时,我总是得到错误

home/userTest/.profile: 语法错误: `if' unmatched

我不知道如何解决这个问题,因为我认为这个脚本定义了连接用户的提示,如果我有这个错误提示只显示“$”

我试过命令

ksh -n /home/userTest/.profile

我总是在文件的最后一行得到错误

#!/bin/ksh
# ksh example 
if [[$0 = "ksh"]];
then
  bash
  exit $?
fi

if [[$0 = "-ksh"]];
then
  bash --login
  exit $?
fi

export LOGIN=$LOGNAME

#prompt config
PS1="$LOGIN@"$(hostname)":$PWD"

if [["$(id -u)" = "0"]];
then
  export PS1="$PS1# "
else
  export PS1="$PS1> "
fi

#Alias utile
alias ll="ls -la"

#Set any export here
export PATH_EXAMPLE=/home/userTest
export JAVA_HOME=$PATH_EXAMPLE/games/java/current
export PATH=$JAVA_HOME/bin:$PATH

我该如何解决这个问题?

谢谢。

【问题讨论】:

  • 当我按原样复制您的代码并使用 "ksh -n" 运行检查时,我没有收到任何错误。您正在使用哪个 ksh ksh88 或 ksh93
  • 如果使用 ksh --version 命令,我会得到“version sh (AT&T Research) 93t+ 2010-06-21”,所以我猜我有 ksh93
  • 无需检查用户是否以root身份运行。把\$放到PS1里面,会根据用户是不是root渲染成$或者#。

标签: syntax syntax-error ksh


【解决方案1】:

我有同样的错误。原来这是由于我在 Windows 中创建的 *.sh 文件中的 DOS 格式换行符(CR-LF),然后传输到 Linux 服务器。

将 DOS 格式换行符 (CR-LF) 转换为 UNIX 格式换行符 (LF) 的命令

  • 在 Windows 中:使用 Notepad++,如 here 所述:

    • 从“编辑”菜单中,选择“EOL 转换”->“UNIX/OSX 格式”。
    • 您还可以通过“设置”->“首选项”->“新建文档/默认目录”在 notepad++ 中设置默认 EOL,然后在“格式”框下选择“Unix/OSX”。
  • 在 UNIX/Linux 中:使用 here 解释的技术之一:

    • 使用sed 命令将 DOS 转换为 UNIX:

    sed 's/^M$//' input.txt > output.txt

    • 使用tr 命令将 DOS 转换为 UNIX:

    tr -d '\r' < input.file > output.file

    • 使用这个 Perl 单行代码将 DOS 转换为 UNIX:

    perl -pi -e 's/\r\n/\n/g' input.file

    • 使用dos2unix 命令将 DOS 转换为 UNIX:

    dos2unix myfile.txtdos2unix -b myfile.txt(带备份)


[奖金提示]

将 UNIX 格式换行符 (LF) 转换为 DOS 格式换行符 (CR-LF) 的命令

  • 使用unix2dos 命令将 UNIX 转换为 DOS:

unix2dos myfile.txtunix2dos -b myfile.txt(带备份)

  • 使用sed 命令将 UNIX 转换为 DOS:

sed 's/$'"/`echo \\\n\\\r`/" input.txt > output.txt(你需要那些\\\,你需要)

【讨论】:

    【解决方案2】:

    我正在使用以下版本

    version         sh (AT&T Research) 93u+ 2012-08-01
    

    我没有收到您上述代码的任何语法错误,尽管您的 if 语句条件而不是

    if [[$0 = "-ksh"]]
    

    应该是

     if [[ $0 == "-ksh" ]] 
    

    if [[ $0 = "-ksh" ]] 
    

    后者已经过时了

    完整代码如下

    #!/bin/ksh
    # ksh example
    if [[ $0 = "ksh" ]];
    then
      bash
    exit $?
    fi
    
    if [[ $0 == "-ksh" ]];
    then
       bash --login
       exit $?
    fi
    
    export LOGIN=$LOGNAME
    
    #prompt config
    PS1="$LOGIN@"$(hostname)":$PWD"
    
    if [[ "$(id -u)" == "0" ]];
    then
    export PS1="$PS1# "
    else
       export PS1="$PS1> "
    fi
    
    #Alias utile
    alias ll="ls -la"
    
    #Set any export here
    export PATH_EXAMPLE=/home/userTest
    export JAVA_HOME=$PATH_EXAMPLE/games/java/current
    export PATH=$JAVA_HOME/bin:$PATH
    

    您的脚本可能有一些不需要的字符,请尝试注意然后使用cat -vte 您也可以尝试命令dos2unix filename,然后运行ksh -n

    【讨论】:

    • 我终于解决了我的问题。我正在从 Windows 创建 mi .ksh 文件,然后将其上传到我的 unix 机器。当我从 unix 创建文件时,问题就解决了。谢谢
    • 如果你已经运行了 dos2unix filename ... 那会解决你的问题 .... 它用 unix line end 替换 ctrl M 字符。
    猜你喜欢
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多