2009-11-23 52 views
10

Hey Tôi muốn chuyển đổi một chuỗi thành một sốTrong kịch bản shell bash làm thế nào để chuyển đổi một chuỗi thành một số

x="0.80" 

#I would like to convert x to 0.80 to compare like such: 
if[ $x -gt 0.70 ]; then 

echo $x >> you_made_it.txt 

fi 

Ngay bây giờ tôi nhận được sự biểu hiện lỗi nguyên dự kiến ​​vì tôi đang cố gắng để so sánh chuỗi.

cảm ơn

+7

0,70 và 0,80, không phải là số nguyên. – ypnos

Trả lời

2

Đối với một số lý do, giải pháp này kháng cáo với tôi:

 
if ! echo "$x $y -p" | dc | grep > /dev/null ^-; then 
    echo "$x > $y" 
else 
    echo "$x < $y" 
fi 

Bạn sẽ cần phải chắc chắn rằng $ x $ và $ y có giá trị (ví dụ chứa chỉ số và số không hoặc một ' . ') và, tùy thuộc vào độ tuổi của bạn là dc, bạn có thể cần phải chỉ định một cái gì đó như' 10k 'để có được nó để nhận ra các giá trị không nguyên.

2

Bash không hiểu số dấu phẩy động. Nó chỉ hiểu số nguyên.

Bạn có thể tiến tới một ngôn ngữ kịch bản mạnh hơn (Perl, Python, Ruby ...) hoặc thực hiện tất cả toán học thông qua bc hoặc tương tự.

0

Ngôn ngữ bash được mô tả tốt nhất là bộ xử lý macro đầy đủ tính năng, vì vậy không có sự khác biệt giữa số và chuỗi. Vấn đề là thử nghiệm (1) hoạt động trên các số nguyên.

+0

Không hoàn toàn đúng. Bourne shell không biết về các số nguyên, nhưng Bash thực hiện, thông qua "typeset -i". –

1

sử dụng awk

x="0.80" 
y="0.70" 
result=$(awk -vx=$x -vy=$y 'BEGIN{ print x>=y?1:0}') 
if [ "$result" -eq 1 ];then 
    echo "x more than y" 
fi 
+0

Rất cleaver. Hoạt động tốt hơn bc. Nó cho phép tôi sử dụng các biến, đó là một yêu cầu, không phải là số tĩnh. Cảm ơn bạn. Đơn giản và rõ ràng. Tôi đã phải học bc để sử dụng nó, cần một giải pháp nhanh chóng và dễ dàng! Cảm ơn bạn! – jewettg

14

bạn có thể sử dụng bc

$ echo "0.8 > 0.7" | bc 
1 
$ echo "0.8 < 0.7" | bc 
0 
$ echo ".08 > 0.7" | bc 
0 

do đó bạn có thể kiểm tra số 0 hoặc 1 trong kịch bản của bạn.

+0

'bc' là những gì tôi cần. Cảm ơn, ghostdog74! –

+0

'bc <<<"0.8 > 0.7" 'hiện nó với chi phí thấp hơn. – Alfe

1

Nếu giá trị của bạn được đảm bảo để được giống như hình thức và phạm vi, bạn có thể làm so sánh chuỗi:

if [[ $x > 0.70 ]] 
then 
    echo "It's true" 
fi 

này sẽ thất bại nếu x là" 0,8" (không hàng đầu zero), ví dụ.

Tuy nhiên, trong khi Bash không hiểu số thập phân, mã được dựng sẵn printf có thể định dạng chúng. Vì vậy, bạn có thể sử dụng nó để bình thường hóa các giá trị của bạn.

$ x=.8 
$ x=$(printf %.2 $x) 
$ echo $x 
0.80 
0

Đây là giải pháp đơn giản của tôi:

BaseLine=70.0   
if [ $string \> $BaseLine ] 
then 
     echo $string 
else 
     echo "TOO SMALL" 
fi 
Các vấn đề liên quan