Làm cách nào để chuyển biến PHP sang tập lệnh Shell?

Trước tiên hãy xem những gì sẽ không hoạt động 100%. Nếu bạn đã quen với việc chuyển các tham số dòng lệnh tới tập lệnh PHP trong trình duyệt web bằng tham số truy vấn (và sau đó tra cứu nó bằng $_GET), bạn có thể đang thử làm điều gì đó như thế này

Tất nhiên PHP sẽ nhanh chóng từ chối điều này với một lỗi như thế này

Lý do xảy ra là vì PHP đang tìm kiếm một tệp có tên "script. php?param1=value1" nhưng tập lệnh thực sự được gọi là "tập lệnh. php". Hệ thống tệp không phải là máy chủ web nên không biết cách xử lý các tham số truy vấn. Một cách tiếp cận khác là cần thiết

Hãy xem xét phương pháp 'cổ điển' để truyền tham số dòng lệnh cho tập lệnh - sử dụng $argc và $argv

Đây là một tập lệnh PHP hiển thị tất cả các đối số dòng lệnh được truyền cho nó

Để truyền đối số dòng lệnh cho tập lệnh, chúng ta chỉ cần đặt chúng ngay sau tên tập lệnh như vậy

Sản lượng được tạo ra là

Lưu ý rằng đối số thứ 0 là tên của tập lệnh PHP được chạy. Phần còn lại của mảng là các giá trị được truyền vào trên dòng lệnh. Các giá trị được truy cập thông qua mảng $argv. Cách tiếp cận này hoạt động, nhưng nó rất đơn giản và không hoạt động tốt nếu bạn đang muốn chuyển từ cách chuyển tham số truy vấn sang giá trị sang tập lệnh của mình. Với cách tiếp cận này, không có cách nào để đặt tên cho các đối số dòng lệnh được truyền vào

Nếu bạn muốn có thể gán tên biến cho các giá trị được truyền vào, getopt() là cách để thực hiện. Bây giờ hãy xem một phiên bản khác của tập lệnh

Hãy chạy tập lệnh này như thế này

Sản lượng được tạo ra là

Có một số khác biệt lớn ở đây. Đầu tiên với getopt() bạn phải chỉ định đối số dòng lệnh nào bạn muốn truy xuất. Trong trường hợp của tập lệnh này, nó sẽ tìm kiếm đối số "-p", được chỉ định bởi "p. " giá trị được chuyển đến getopt(). Dấu hai chấm (. ) có nghĩa là tham số phải có giá trị. Nếu bạn đã quen làm những việc như "tập lệnh. php?p=value1" cái này tương đương với dòng lệnh

Cũng có thể chuyển nhiều giá trị vào e. g

Trong trường hợp này, giá trị thay đổi thành một mảng, vì vậy điều quan trọng là phải kiểm tra loại giá trị trước khi sử dụng

Nếu bạn muốn truyền vào nhiều tham số có tên khác nhau e. g. "p" và "q", bạn thay đổi cách gọi getopt() như thế này

Sau đó chạy kịch bản như thế này

sản xuất đầu ra này

Cách sử dụng getopt() ở trên giới hạn bạn sử dụng tên tham số ký tự đơn, nếu bạn muốn sử dụng tên tham số như "tên" thì sao?

Khi sử dụng tên tham số dài, cách chạy tập lệnh PHP sẽ thay đổi một chút, trong trường hợp này, chúng tôi truyền tham số như sau

Đầu ra sau đó là

Điều này cũng có thể được mở rộng thành nhiều tham số được đặt tên khác nhau. Truyền cùng một tham số có tên nhiều lần cũng dẫn đến giá trị thuộc kiểu mảng, giống như mô tả trước đó. Cũng có thể chuyển các giá trị có dấu cách trong đó bằng cách đặt chúng trong dấu ngoặc kép

Bài viết này không đề cập đến tất cả các khả năng với getopt() nhưng nó cung cấp một điểm khởi đầu và hy vọng bây giờ bạn có thể chuyển đổi tập lệnh sử dụng các tham số truy vấn thông thường với $_GET thành một thứ sử dụng một trong các cách tiếp cận đã nêu ở trên

-Tôi

Mặc dù tôi đã nỗ lực rất nhiều để nghiên cứu tất cả các chủ đề mà tôi đề cập, nhưng vẫn có thể xảy ra sai sót. Việc sử dụng bất kỳ thông tin nào từ các bài đăng trên blog của tôi phải tự chịu rủi ro và tôi không chịu bất kỳ trách nhiệm pháp lý nào đối với bất kỳ việc lạm dụng thông tin hoặc thiệt hại nào do theo dõi bất kỳ bài đăng nào của tôi

Tất cả nội dung và ý kiến ​​thể hiện trên Blog này là của riêng tôi và không đại diện cho ý kiến ​​của chủ nhân của tôi (Oracle). Việc sử dụng bất kỳ thông tin nào có trong bài đăng / bài viết trên blog này phải tuân theo tuyên bố từ chối trách nhiệm này

proc_open is probably a better solution for most use cases as of PHP 7.4.  There is better control and platform independence.  If you still want to use shell_exec(), I like to wrap it with a function that allows better control.

Something like below solves some problems with background process issues on apache/php.  It also

public function sh_exec(string $cmd, string $outputfile = "", string $pidfile = "", bool $mergestderror = true, bool $bg = false) {
  $fullcmd = $cmd;
  if(strlen($outputfile) > 0) $fullcmd .= " >> " . $outputfile;
  if($mergestderror) $fullcmd .= " 2>&1";
  if($bg) {
    $fullcmd = "nohup " . $fullcmd . " &";
    if(strlen($pidfile)) $fullcmd .= " echo $! > " . $pidfile;
  } else {
    if(strlen($pidfile) > 0) $fullcmd .= "; echo $$ > " . $pidfile;
  }
  shell_exec($fullcmd);
}

This posting is not a php-only problem, but hopefully will save someone a few hours of headaches.  Running on MacOS (although this could happen on any *nix I suppose), I was unable to get the script to execute without specifically envoking php from the command line:

[macg4:valencia/jobs] tim% test.php
./test.php: Command not found.

However, it worked just fine when php was envoked on the command line:

[macg4:valencia/jobs] tim% php test.php
Well, here we are...  Now what?

Was file access mode set for executable?  Yup.

________số 8_______

And you did, of course, remember to add the php command as the first line of your script, yeah?  Of course.

#!/usr/bin/php

So why dudn't it work?  Well, like I said.. on a Mac... but I also occasionally edit the files on my Windows portable (i.e. when I'm travelling and don't have my trusty Mac available)...  Using, say, WordPad on Windows.. and BBEdit on the Mac...

Aaahhh.. in BBEdit check how the file is being saved!  Mac?  Unix?  or Dos?  Bingo.  It had been saved as Dos format.  Change it to Unix:

[macg4:valencia/jobs] tim% test.php
./test.php: Command not found.
0

[macg4:valencia/jobs] tim% test.php
./test.php: Command not found.
1

Làm cách nào để truyền đối số trong shell script PHP?

Để truyền đối số dòng lệnh cho tập lệnh, chúng ta chỉ cần đặt chúng ngay sau tên tập lệnh như vậy. Lưu ý rằng đối số thứ 0 là tên của tập lệnh PHP được chạy. Phần còn lại của mảng là các giá trị được truyền vào trên dòng lệnh. Các giá trị được truy cập thông qua mảng $argv.

$_ trong shell script là gì?

$_ (dấu gạch dưới đô la) là một tham số bash đặc biệt khác và được sử dụng để tham chiếu tên tệp tuyệt đối của tập lệnh shell hoặc bash đang được thực thi như được chỉ định trong danh sách đối số< . Tham số bash này cũng được sử dụng để giữ tên của tệp thư trong khi kiểm tra email. . This bash parameter is also used to hold the name of mail file while checking emails.

${} trong bash là gì?

$() có nghĩa là. "đầu tiên đánh giá điều này, và sau đó đánh giá phần còn lại của dòng". Bán tại. tiếng vang $(pwd)/myFile. txt. sẽ được hiểu là echo /my/path/myFile. txt. Mặt khác, ${} mở rộng một biến .

Biến $ trong bash là gì?

Nếu biến1 là tên của một biến, thì $biến1 là tham chiếu đến giá trị của biến đó, mục dữ liệu mà biến đó chứa . [ 1] bash$ variable1=23 bash$ echo biến1 biến1 bash$ echo $variable1 23.