Khi tôi chạy các lệnh trong shell của mình như bên dưới, nó sẽ trả về một expr: non-integer argument
lỗi. Có ai đó giải thích điều này cho tôi biết không?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Khi tôi chạy các lệnh trong shell của mình như bên dưới, nó sẽ trả về một expr: non-integer argument
lỗi. Có ai đó giải thích điều này cho tôi biết không?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Câu trả lời:
Các biến đó là biến shell. Để mở rộng chúng làm tham số cho chương trình khác ( tức là expr
), bạn cần sử dụng $
tiền tố:
expr $x / $y
Lý do nó phàn nàn là vì nó nghĩ rằng bạn đang cố gắng hoạt động trên các ký tự chữ cái ( nghĩa là không nguyên)
Nếu bạn đang sử dụng shell Bash, bạn có thể đạt được kết quả tương tự bằng cú pháp biểu thức:
echo $((x / y))
Hoặc là:
z=$((x / y))
echo $z
man bash
tại dấu nhắc ( q
để thoát)
Tôi tin rằng nó đã được đề cập trong các chủ đề khác:
calc(){ awk "BEGIN { print "$*" }"; }
sau đó bạn có thể chỉ cần gõ:
calc 7.5/3.2
2.34375
Trong trường hợp của bạn, nó sẽ là:
x=20; y=3;
calc $x/$y
hoặc nếu bạn thích, hãy thêm tập lệnh này dưới dạng một tập lệnh riêng biệt và làm cho nó có sẵn trong $ PATH để bạn sẽ luôn có nó trong trình bao cục bộ của mình:
#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }
echo '1 / 3' | bc -l
Tại sao không dùng let; Tôi thấy nó dễ dàng hơn nhiều. Đây là một ví dụ bạn có thể thấy hữu ích:
start=`date +%s`
# ... do something that takes a while ...
sleep 71
end=`date +%s`
let deltatime=end-start
let hours=deltatime/3600
let minutes=(deltatime/60)%60
let seconds=deltatime%60
printf "Time spent: %d:%02d:%02d\n" $hours $minutes $seconds
Một ví dụ đơn giản khác - tính số ngày kể từ năm 1970:
let days=$(date +%s)/86400
Shell mặc định trên hầu hết các bản phân phối Linux là Bash. Trong Bash, các biến phải sử dụng tiền tố ký hiệu đô la để mở rộng tham số . Ví dụ:
x=20
y=5
expr $x / $y
Tất nhiên, Bash cũng có các toán tử số học và cú pháp mở rộng số học đặc biệt , do đó không cần phải gọi nhị phân expr như một quy trình riêng biệt. Bạn có thể để shell thực hiện tất cả các công việc như thế này:
x=20; y=5
echo $((x / y))
expr
không được khuyến khích trong năm 2013.
Giả sử
x=50
y=5
sau đó
z=$((x/y))
Điều này sẽ hoạt động đúng. Nhưng nếu bạn muốn sử dụng / toán tử trong các câu lệnh tình huống thì nó không thể giải quyết nó. Trong trường hợp đó, sử dụng các chuỗi đơn giản như div hoặc devide hoặc một cái gì đó khác. Xem mã
/
hoạt động tốt như một nhãn vỏ. Những gì không hoạt động là sử dụng *
để nhân lên mà không trích dẫn nó, đó có thể là những gì bạn thực sự đã làm; mà nguyên nhân nó để ghi đè lên một cách hiệu quả tất cả các mục sau đây trong trường hợp, mà trong ví dụ của bạn là 'chia' và 'modulo'
Để lấy số sau dấu thập phân, bạn có thể làm điều này: -
read num1 num2
div=`echo $num1 / $num2 |bc -l`
echo $div