×

关于Bash脚本参数$@的用法:一个双引号引发的问题

Falcon 2024-05-21 views:
摘要

正在生成中……

今天发现一个奇怪的问题,如果我直接运行这条命令:

docker run -i --rm -v pwd:pwd falconchen/m2k-php-fpm:latest php -r "echo 123;" 会得到正确的输出,“123”, 但是如果我在 /usr/local/bin/php内写入

#!/bin/bash

docker run -i --rm -v `pwd`:`pwd` falconchen/m2k-php-fpm:latest php $@

保存并增加为可执行权限,运行 php -r "echo 123;" 将会报错:

PHP Parse error: syntax error, unexpected end of file in Command line code on line 1

Parse error: syntax error, unexpected end of file in Command line code on line 1

该如何修改?

这个错误是由于 $@ 的展开方式导致的。在 Bash 脚本中,$@ 如果没有被正确地用双引号包裹,会导致参数在传递过程中被错误地拆分。为了确保参数被正确传递,你需要在脚本中使用 "$@" 而不是 $@

下面是修改后的 /usr/local/bin/php 脚本:

#!/bin/bash

docker run -i --rm -v `pwd`:`pwd` falconchen/m2k-php-fpm:latest php "$@"

请确保你保存了这个脚本,并给予其可执行权限:

chmod +x /usr/local/bin/php

现在,运行 php -r "echo 123;" 应该能够正确输出 123

解释

  • "$@" 代表所有传递给脚本的参数,并保持它们的完整性(即每个参数仍然作为独立的参数)。
  • $@ 在没有双引号的情况下会将所有参数视为一个整体,并在参数包含空格或特殊字符时引起问题。

通过使用 "$@",可以确保 Docker 容器中的 php 命令能够正确接收到传递的参数,从而避免语法错误。

本文收录于